2012-05-14 19 views
6

Projemde bir yürütülebilir ve bir paylaşılan kitaplık var. Paylaşılan kitaplık, destek kitaplığını kullanır. çalıştırılabilir olny paylaşılan kütüphaneyi kullanır.Linux üzerinde CMake ile paylaşılan kitaplığa destek bağlama

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

Kök CKağıt-file:

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-testi/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} 
      ) 

(bazı önemsiz kestim şeyler)

Pencerelerde

sorunsuz çalışıyor (ama orada ben CMake olmadan VisuelStudio kullanın), ancak linux i bağlama hataları aşağıdaki olsun: Bana verilen seçenekleri ile kombinasyonlar çok denedim

../../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 

ama olmadı bağlantı kurabilir. Hata yaptığımı biliyor musunuz? CMake'i ilk kez ciddi bir şekilde kullandığım ilk kez budur :)

cevap

7

CMake değişkenleri büyük/küçük harfe duyarlıdır ve FindBoost modülü, destek kitaplıklarını değil, Boost_LIBRARIES adlı bir değişkene ayarlar.

İki target_link_libraries numaranızda ${BOOST_LIBRARIES}'u ${Boost_LIBRARIES} ile değiştirirseniz ve doğru şekilde çalışması gerekir. FindBoost modülünde tam bilgi için

, çalıştırın:

cmake --help-module FindBoost 
+0

ok şimdi herşeyi derlemek (ve bir segment hataya olsun;) nerver zihin) ama t-testi yürütülebilir destek bağlamak zorunda. Paylaşılan kütüphanenin içindeki desteği gizlemek mümkün mü? – Databyte

+1

Ne demek istediğinden emin değilim. Bir başka deyişle, "tilenet" in bağımlılığı olarak libs'i bağımlı olarak belirledikten sonra, başka bir hedefin bağımlılığı olarak tilenet'i belirttiğinizde, CMake otomatik olarak artırma lib'lerini daha fazla bağımlılık olarak tanımlar. Diğer bir deyişle, zaten "tilenet" içeriyorsa, başka bir "target_link_libraries" çağrısında "$ {BOOST_LIBRARIES}" ifadesini açıkça listelemenize gerek yoktur. – Fraser

+0

tamam kulağa hoş geliyor teşekkürler – Databyte