2012-05-14 27 views
6

tengo un ejecutable y una biblioteca compartida en mi proyecto. La biblioteca compartida usa la biblioteca de impulso. el ejecutable usa olny la biblioteca compartida.Linking boost a la biblioteca compartida con CMake en Linux

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

Root-Cmake archivo:

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) 

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

(he cortado alguna importancia cosas)

En las ventanas que funciona bien (pero hay que usar VisuelStudio sin CMake), pero en Linux me sale siguientes errores: que unen

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

que he probado muchas combinaciones con opciones dadas pero no estaba capaz de vincularlo. ¿Sabes dónde cometí errores? Esta es la primera vez que uso CMake en serio :)

Respuesta

7

Las variables de CMake distinguen entre mayúsculas y minúsculas, y el módulo FindBoost establece las bibliotecas de impulso en una variable llamada Boost_LIBRARIES, no BOOST_LIBRARIES.

Si reemplaza ${BOOST_LIBRARIES} con ${Boost_LIBRARIES} en sus dos llamadas target_link_libraries, debería funcionar correctamente.

Para información completa sobre el módulo FindBoost, ejecute:

cmake --help-module FindBoost 
+0

ok ahora puede compilar todo (y obtener un fallo de segmentación;) nerver mente), pero tengo que enlazar impulso al ejecutable ttest. ¿Es posible ocultar el impulso dentro de la biblioteca compartida? – Databyte

+1

No estoy seguro de lo que quiere decir. Una vez que haya especificado las libs de impulso como una dependencia de 'tilenet', cada vez que especifique' tilenet' como la dependencia de otro destino, CMake identifica automáticamente las libs de impulso como dependencias adicionales. En otras palabras, no es necesario incluir explícitamente '$ {BOOST_LIBRARIES}' en otra llamada 'target_link_libraries' si ya contiene' tilenet'. – Fraser

+0

ok suena bien gracias – Databyte

Cuestiones relacionadas