Linking a boost to a shared library with CMake on Linux

My project has one executable and one shared library. The shared library uses the boost library. the executable file uses a shared library.

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

Root cmake 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) 

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

(I cut off some unimportant things)

It works fine in windows (but there I use VisuelStudio without CMake), but on linux I get the following binding errors:

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

I tried many combinations with the given parameters, but I could not connect it. Do you know where I made mistakes? This is the first time I've seriously used CMake :)

+6
source share
1 answer

CMake variables are case sensitive, and the FindBoost module sets boost libraries to a variable named Boost_LIBRARIES , not Boost_LIBRARIES .

If you replace ${BOOST_LIBRARIES} with ${BOOST_LIBRARIES} with your two calls to target_link_libraries , and it should work correctly.

For complete information on the FindBoost module, do:

 cmake --help-module FindBoost 
+7
source

Source: https://habr.com/ru/post/915688/


All Articles