链接Boost - 未定义的引用到`boost :: serialization :: singleton_module :: get_lock()'

问题描述 投票:1回答:1

我有自己的库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 - my library

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 - my executable

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。

我还从LINK_LIBRARIES删除了与set_target_properties()的一行,但不幸的是,它没有改变任何东西,问题仍然存在。


编辑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添加到命令就足够了,因为它指向正确的库。

c++ boost cmake compilation dynamic-linking
1个回答
0
投票

所以,我想到了一个使用序列化库的最小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并影响你需要的任何方面。

© www.soinside.com 2019 - 2024. All rights reserved.