【发布时间】:2018-09-06 17:04:34
【问题描述】:
我有自己的库mylib,它使用Boost 序列化库并动态链接它。现在我想将我的库链接到另一个代码 - 命令如下所示:
/usr/bin/g++-8 -Wall -g -rdynamic CMakeFiles/net_test_ode_1.dir/net_test_ode_1.cpp.o -o ../bin/examples/net_test_ode_1 -Wl,-rpath,/home/martin/MyLib/build/lib:/home/martin/MyLib/external_dependencies/boost/stage/lib ../lib/libmylib.so ../../external_dependencies/boost/stage/lib/libboost_system.so ../../external_dependencies/boost/stage/lib/libboost_serialization.so ../../external_dependencies/boost/stage/lib/libboost_random.so
../lib/libmylib.so: undefined reference to `boost::serialization::singleton_module::get_lock()'
collect2: error: ld returned 1 exit status
如您所见,我不仅链接了libmylib.so,还链接了libboost_serialization.so,因此不应该缺少任何依赖项。
不过,我收到了这个未定义的引用错误。它更令人困惑,因为我已经将它链接到我的库,所以如果我理解正确的话,这里不应该需要它。
你知道吗,我做错了什么?
CMakeLists.txt - 我的库
if ("${BUILD_LIB}" STREQUAL "yes")
add_library(mylib SHARED
source codes...
)
set_target_properties(
mylib
PROPERTIES
INCLUDE_DIRECTORIES "${ROOT_DIR}/include;${SRC_DIR};${Boost_INCLUDE_DIRS}"
LINK_LIBRARIES "${BOOST_LIBRARIES}"
ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib"
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib"
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin"
)
CMakeLists.txt - 我的可执行文件
add_executable(net_test_1 net_test_1.cpp)
set_target_properties(
net_test_1
PROPERTIES
INCLUDE_DIRECTORIES "${ROOT_DIR}/include"
LINK_LIBRARIES "mylib;${BOOST_LIBRARIES}"
ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib/"
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib"
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/examples"
)
编辑:
根据compor的评论,我已经添加了
target_link_libraries(mylib PUBLIC ${BOOST_LIBRARIES})
到 CMakeLists 和我的库和
target_link_libraries(net_test_1 PUBLIC mylib)
到 CMakeLists 和我的可执行文件。
我还从set_target_properties() 中删除了带有LINK_LIBRARIES 的行,但它并没有改变任何东西,不幸的是,问题仍然存在。
编辑 2:
根据ChrisD的评论,我尝试使用-rpath-link,但结果还是一样
/usr/bin/g++ -Wall -g -rdynamic CMakeFiles/net_test_ode_1.dir/net_test_ode_1.cpp.o -o ../bin/examples/net_test_ode_1 -Wl,-rpath-link=/home/martin/MyLibRepo/external_dependencies/boost/stage/lib ../lib/libmylib.so ../../external_dependencies/boost/stage/lib/libboost_system.so ../../external_dependencies/boost/stage/lib/libboost_serialization.so ../../external_dependencies/boost/stage/lib/libboost_random.so
../lib/libmylib.so: undefined reference to `boost::serialization::singleton_module::get_lock()'
我发现,当我将-lboost_serialization 添加到编译命令时,它可以正常工作而不会出现错误。这怎么可能?我想,在命令中添加../../external_dependencies/boost/stage/lib/libboost_serialization.so 就足够了,因为它指向了正确的库。
【问题讨论】:
-
您应该使用变量
${Boost_LIBRARIES}。在 CMake 变量名中,大小写很重要。 -
@vre
BOOST_LIBRARIES是我自己的变量,它真的是大写的。 -
This page 可能有用,尤其是关于
-rpath-link的部分。 -
@Eenoku 您应该使用
target_link_libraries而不是手动设置属性。该命令取决于PRIVATE|INTERFACE|PUBLIC的选项,将为您处理传递依赖关系。目前,您将 Boost 库设置为相当于使用PRIVATE,而不是设置INTERFACE_LINK_LIBRARIES属性的PUBLIC或INTERFACE。 -
@compor 感谢您的建议!我试过使用
target_link_libraries,但这似乎不是我的问题......你还有其他想法吗?还是您需要更多信息?
标签: c++ boost cmake compilation dynamic-linking