我的项目中有一个可执行文件和一个共享库。 共享库使用boost库。 可执行文件使用olny共享库。
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上工作正常(但我没有使用CMake的VisuelStudio),但在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 🙂
CMake变量区分大小写,FindBoost模块将boost库设置为名为Boost_LIBRARIES
的变量,而不是BOOST_LIBRARIES
。
如果在两个target_link_libraries
调用${Boost_LIBRARIES}
${BOOST_LIBRARIES}
替换${BOOST_LIBRARIES}
${Boost_LIBRARIES}
,并且它应该可以正常工作。
有关FindBoost模块的完整信息,请运行:
cmake --help-module FindBoost