2012-06-27 64 views
3

我鏈接到boost_program_options一個應用程序,它的CMakeLists.txt看起來像鏈接到與CMake和VS2010靜態加速lib中沒有自動連接

FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED) 
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) 
TARGET_LINK_LIBRARIES(${SUBPROJECT_NAME} ${Boost_LIBRARIES}) 

我在我的代碼使用#define BOOST_ALL_NO_LIB包括<boost/program_options.hpp>前禁用自動在vs2010中連接boost,因爲我想通過cmake指定它與linux兼容。

在Linux中,這段代碼編譯得很好(使用cmake,make和gcc)。 而在Windows與VS2010,我得到一個

2>App.obj : error LNK2001: unresolved external symbol "public: static unsigned int const boost::program_options::options_description::m_default_line_length" ([email protected][email protected][email protected]@@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" ([email protected][email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@A) 

注意,鏈接器找到的lib - 如果它沒有找到它,我會得到更多的無法解析的外部錯誤。

我跟蹤到以下問題: http://lists.boost.org/boost-users/2009/11/54015.php這很好地描述了正在發生什麼(這兩個是全局變量)。現在提出的解決方案是啓用動態鏈接並鏈接到DLL。但這不是我想要做的,我想鏈接到靜態提升庫(我實際上試圖做的,在鏈接器下VS的應用程序屬性 - >輸入它列出了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_4 7.lib,我得到了一大堆關於在boost-lib中已經定義的CRT符號的新鏈接器錯誤。 在按照panickal的建議更改VS運行時選項後,這些錯誤也消失了,它正在工作。

+0

您是否在* find_package'調用之前添加了3個'set'調用? – Fraser

+0

當然可以。問題已解決,因爲無論如何:-) – Ela782

回答

7

你必須鏈接到靜態庫。嘗試鏈接到boost_program_options-vc100-mt-sgd-1_47.lib而不是boost_program_options-vc100-mt-gd-1_47.lib

s指示庫的靜態版本。您可以查看Boost Library Naming瞭解有關命名約定的更多詳細信息。

更新: 要解決了多重定義鏈接錯誤,更改從Multi-threaded Debug DLL (/MDd)Configuration Properties/C/C++/Code Generation/Runtime Library Visual Studio的運行時庫選項Multi-threaded Debug (/MTd)

+0

我一直認爲.lib文件始終是一個靜態庫,而.dll是一個動態庫。 該手冊說: 「在Windows上,.dll表示共享庫,.lib表示靜態或導入庫。」並進一步向下「Key:s - 靜態鏈接到C++標準庫和編譯器運行時支持庫」。我現在很困惑。 好的,我只是設置了「set(Boost_USE_STATIC_RUNTIME ON),VS中的boost錯誤消失了,所以現在內置了_runtime_,我想我開始明白了,但我認爲這不是我想要的嗎?現在大約有一些新的鏈接器錯誤... – Ela782

+0

「msvcprtd.lib(MSVCP100D.dll):錯誤LNK2005:」public:... something ...已在libboost_program_options-vc100-mt-sgd-1_47.lib中定義。 – Ela782

+2

在Windows上,'.dll'用於動態鏈接。但是當你編譯程序時,你必須鏈接一個'.lib'文件,其中包含所需的符號。而'.lib'與'static .lib'文件不同。 – panickal