3

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 ランタイム オプションを変更した後、これらのエラーもなくなり、機能しています。

4

1 に答える 1

7

静的ライブラリにリンクする必要があります。boost_program_options-vc100-mt-sgd-1_47.libの代わりに にリンクしてみてくださいboost_program_options-vc100-mt-gd-1_47.lib

は、ライブラリのs静的バージョンを示します。命名規則の詳細については、Boostライブラリの命名を確認してください。

更新: 複数の定義リンカー エラーを修正するには、Visual Studio ランタイム ライブラリ オプションをConfiguration Properties / C/C++ / Code Generation / Runtime Libraryから Multi-threaded Debug DLL (/MDd)に変更しMulti-threaded Debug (/MTd)ます。

于 2012-06-28T00:07:58.673 に答える