gpt4 book ai didi

c++ - 链接 boost - 对 `boost::serialization::singleton_module::get_lock()' 的 undefined reference

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:54 24 4
gpt4 key购买 nike

我有自己的库 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,因此不应缺少任何依赖项。

不过,我还是遇到了这个 undefined reference 错误。更令人困惑的是,因为我已经将它链接到我的库,所以如果我理解正确的话,这里不需要它。

你知道吗,我做错了什么?


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 项目。

项目结构:

.
├── app
│   ├── app.cpp
│   └── CMakeLists.txt
├── CMakeLists.txt
└── mylib
├── CMakeLists.txt
├── mylib.cpp
└── mylib.hpp

应用/CMakeLists.txt:

add_executable(app app.cpp)
target_include_directories(app PUBLIC mylib)
target_link_libraries(app PUBLIC mylib)

mylib/CMakeLists.txt:

add_library(mylib mylib.cpp)

target_include_directories(mylib PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
${Boost_INCLUDE_DIRS})

target_link_libraries(mylib PUBLIC ${Boost_LIBRARIES})

主要 CMakeLists.txt:

cmake_minimum_required(VERSION 3.11)

project(ser CXX)

find_package(Boost COMPONENTS serialization REQUIRED)

add_subdirectory(app)
add_subdirectory(mylib)

我认为您需要使用 find_package 设置的变量,因为这些变量的获取方式与您的系统安装相匹配。您可以随时浏览 doc并影响您需要的任何方面。

关于c++ - 链接 boost - 对 `boost::serialization::singleton_module::get_lock()' 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52209059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com