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 :)
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
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
ok suena bien gracias – Databyte