2012-05-14 159 views
6

我的項目中有一個可執行文件和一個共享庫。 共享庫使用boost庫。可執行文件使用olny共享庫。在Linux上使用CMake將提升鏈接到共享庫

tilenet/    <-- Project 
    ttest/   <-- Test (executable) 
     CMakeLists.txt 
    tilenet/   <-- The shared library 
     CMakeLists.txt 
    CMakeLists.txt <-- Root CMake-file 

根CMake的文件:

cmake_minimum_required(VERSION 2.6) 

project(tilenet) 

set(Boost_USE_STATIC_LIBS  OFF) # I've already tried ON 
set(Boost_USE_MULTITHREADED  ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 


find_package(Boost 1.49 COMPONENTS system filesystem REQUIRED) 

include_directories(${Boost_INCLUDE_DIRS}) 

add_subdirectory(test) 
add_subdirectory(tilenet) 

t檢驗/的CMakeLists.txt

add_executable(ttest test.cpp) 
target_link_libraries(ttest tilenet ${BOOST_LIBRARIES}) 

tilenet /的CMakeLists.txt

include_directories("include") 
set(tilenet_src "src/tilenet.cpp" ...) 

add_library(tilenet SHARED ${tilenet_src}) 
target_link_libraries(tilenet 
      ${SFML_LIBRARIES} 
      ${BOOST_LIBRARIES} 
      ) 

(我已經削減了一些不重要東西)

在Windows上工作正常(但我使用VisuelStudio沒有CMake的),但在Linux上 我獲得以下鏈接錯誤:

../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path_traits::convert(wchar_t const*, wchar_t const*, std::string&, std::codecvt<wchar_t, char, __mbstate_t> const&)' 
../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path::operator/=(boost::filesystem3::path const&)' 
../../lib/libtilenet.so: undefined reference to `boost::system::system_category()' 
../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path::wchar_t_codecvt_facet()' 
../../lib/libtilenet.so: undefined reference to `boost::system::generic_category()' 
../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path_traits::convert(char const*, char const*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&, std::codecvt<wchar_t, char, __mbstate_t> const&)' 
collect2: error: ld returned 1 exit status 
make[2]: *** [../bin/ttest] Error 1 
make[1]: *** [test/CMakeFiles/ttest.dir/all] Error 2 
make: *** [all] Error 2 

我已經嘗試了很多組合與給定的選擇,但我不能夠鏈接它。 你知道我犯了什麼錯誤嗎?這是我第一次認真使用CMake :)

回答

7

CMake變量區分大小寫,FindBoost模塊將boost庫設置爲名爲Boost_LIBRARIES的變量,而不是BOOST_LIBRARIES

如果您在兩個target_link_libraries調用中將${BOOST_LIBRARIES}替換爲${Boost_LIBRARIES}並且它應該正常工作。

對於FindBoost模塊上充分的信息,運行:

cmake --help-module FindBoost 
+0

確定現在我可以編譯一切(並得到一個分段錯誤;)nerver心),但我必須提升鏈接到TTEST可執行文件。是否有可能在共享庫中隱藏boost? – Databyte

+1

不確定你的意思。一旦將boost庫指定爲'tilenet'的依賴項,只要將'tilenet'指定爲另一個目標的依賴項,CMake就會自動將boost庫標識爲進一步的依賴項。換句話說,如果已經包含'tilenet',就不需要在另一個'target_link_libraries'調用中顯式地列出'$ {BOOST_LIBRARIES}'。 – Fraser

+0

好聽起來不錯,謝謝 – Databyte