2016-01-02 66 views
1

我有一個使用Boost.Log的靜態庫。當我想測試這個LIB的一些功能在seaparate測試項目中,我得到的follwing鏈接錯誤:鏈接器錯誤使用boost :: log在一個靜態庫中

undefined reference to `boost::log::v2_mt_posix::sources::aux::global_storage::get_or_init(boost::typeindex::stl_type_index, boost::shared_ptr<boost::log::v2_mt_posix::sources::aux::logger_holder_base> (*)())' 

undefined reference to `boost::log::v2_mt_posix::sources::aux::throw_odr_violation(boost::typeindex::stl_type_index, boost::typeindex::stl_type_index, boost::log::v2_mt_posix::sources::aux::logger_holder_base const&)' 

undefined reference to `boost::log::v2_mt_posix::aux::code_convert_impl(wchar_t const*, unsigned long, std::string&, std::locale const&)' 

我在靜態庫,其配置Boost.Log並安裝一個全球性的記錄器記錄器級。我真的不知道我必須鏈接到測試項目才能成功鏈接。也許你有一個想法?

通過CMake我添加了以下庫的靜態庫:

target_link_libraries(RBSLib 
     boost_system 
     boost_filesystem 
     boost_python 
     boost_date_time 
     boost_program_options 
     boost_log 
     boost_thread   
     pq 
     ssl 
     crypto 
     boost_regex 
     pthread 
     dl 
) 

而且follwing庫到我的測試項目:

target_link_libraries(${PROJECT_NAME} 
     boost_system 
     boost_date_time 
     boost_unit_test_framework 
     tbb 
     pq 
     ssl 
     pthread 
${PROJECT_BINARY_DIR}/../rbs/libRBSLib.a 
     boost_thread 
     boost_filesystem 
     boost_program_options 
     crypto 
     boost_log 
) 

回答

0

您需要添加新庫的依賴,也是當你編譯靜態庫的時候也是這樣。換句話說,你需要在測試項目的編譯器和鏈接器屬性中添加boost的include路徑和庫(這是編譯你的lib所需的)。這是因爲你的新庫不是和boost(或其他庫)靜態鏈接在一起的。它仍然需要顯式的外部庫。

+0

我想我已經像你解釋過的那樣做了。我用一些CMake部分更新了我的帖子,也許libs的順序有錯誤?當我移動libRBSLib.a條目時,錯誤發生了變化。 – Paul

+0

@保羅我不認爲這是庫的順序。您的測試項目的依賴關係應該涉及靜態庫的依賴關係。在靜態庫的配置中刪除不必要的庫,或者將它們添加到測試項目中(例如boost_python)。 – seleciii44

+0

好吧,我還沒有將boost lib目錄添加到我的測試項目的Cmake文件中。現在它編譯:-) – Paul