链接 Boost - 未定义对 `boost::serialization::singleton_module::get_lock()' 的引用
Linking Boost - undefined reference to `boost::serialization::singleton_module::get_lock()'
我有自己的库 mylib
,它使用 Boost 序列化库并 link 动态地使用它。现在我想 link 我的库到另一个代码 - 命令看起来像这样:
/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
如您所见,我 link 不仅 libmylib.so
,而且 libboost_serialization.so
,所以应该不会缺少任何依赖项。
我仍然遇到这个未定义的引用错误。更令人困惑的是,因为我已经 link 将它编辑到我的图书馆,所以如果我理解正确的话,这里不需要它。
你知道吗,我做错了什么?
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
app/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 并影响您需要的任何方面。
我有自己的库 mylib
,它使用 Boost 序列化库并 link 动态地使用它。现在我想 link 我的库到另一个代码 - 命令看起来像这样:
/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
如您所见,我 link 不仅 libmylib.so
,而且 libboost_serialization.so
,所以应该不会缺少任何依赖项。
我仍然遇到这个未定义的引用错误。更令人困惑的是,因为我已经 link 将它编辑到我的图书馆,所以如果我理解正确的话,这里不需要它。
你知道吗,我做错了什么?
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})
使用我的库和
到 CMakeListstarget_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
app/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 并影响您需要的任何方面。