CMakeLists.txtが次のように見えるboost_program_optionsにリンクするアプリを入手しました
FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES( ${SUBPROJECT_NAME} ${Boost_LIBRARIES} )
Linuxと互換性を持たせるためにcmakeで指定したいので、vs2010でブーストの自動リンクを無効にする#define BOOST_ALL_NO_LIB
前にコードで使用します。<boost/program_options.hpp>
Linux では、このコードは正常にコンパイルされます (cmake、make、および gcc を使用)。しかし、VS2010 を搭載した Windows では、
2>App.obj : error LNK2001: unresolved external symbol "public: static unsigned int const boost::program_options::options_description::m_default_line_length" (?m_default_line_length@options_description@program_options@boost@@2IB)
2>App.obj : error LNK2001: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > boost::program_options::arg" (?arg@program_options@boost@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A)
リンカーがライブラリを見つけることに注意してください。見つからない場合は、さらに多くの未解決の外部エラーが発生します。
問題を次のように追跡しました:
http://lists.boost.org/boost-users/2009/11/54015.phpは、何が起こっているかを非常にうまく説明しています (これら 2 つはグローバル変数です)。現在提案されている解決策は、動的リンクを有効にして DLL にリンクすることです。しかし、それは私がやりたいことではありません。私は静的なブーストライブラリにリンクしたいと思います(これは実際にやろうとしています.VSのアプリプロパティのLinker->InputにリストされていますD:\boost\boost_1_47\lib\boost_program_options-vc100-mt-gd-1_47.lib
.
私も追加してみました
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
私のCMakeLists.txtに追加しましたが、何も変わりません。
この問題を解決する方法はありますか?
更新: boost_program_options-vc100-mt-sgd-1_47.lib とリンクすると、ブースト ライブラリで既に定義されている CRT シンボルに関する新しいリンカー エラーが大量に発生します。panickal で提案されているように VS ランタイム オプションを変更した後、これらのエラーもなくなり、機能しています。