首页 > 解决方案 > 为什么链接器无法解析符号?

问题描述

无法弄清楚问题出在哪里。我有一个使用 Cmake 的 CLion 项目。

我有两个主要目标

  1. tstreamer - 是一个共享库,巫婆依赖于 libtorrent 并包装它
add_library(tstreamer SHARED tstreamer.cpp)
target_link_libraries(tstreamer PRIVATE torrent PUBLIC pthread)
  1. test - 是一个 CLI 二进制文件,它在底层使用 tstreamer(1) 库,不需要直接使用 libtorrent
add_executable(test main.cpp)
target_link_libraries(test tstreamer)

当我尝试构建这个项目时,我得到了链接器错误

/usr/bin/ld: CMakeFiles/test.dir/main.cpp.o: undefined reference to symbol '_ZN10libtorrent7sessionD1Ev'
//usr/local/lib/libtorrent.so.1.2.9: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

去错符号是 libtorrent::session::~session()

我的问题是为什么我不能将PRIVATE torrent留在我的共享库中?为什么我需要两次指定 libtorrent 依赖项 - 一个用于我的共享库,另一个用于测试二进制文件?

编译测试二进制文件的命令是

/usr/bin/c++  -g   CMakeFiles/test.dir/main.cpp.o  -o test  -Wl,-rpath,/home/****/CLionProjects/t_streamer_lib/cmake-build-debug libtstreamer.so -lpthread 

为什么链接器无法确定需要 libtorrent,毕竟 ldd for tstreamer 这么说。

    linux-vdso.so.1 (0x00007ffc58513000)
    libtorrent.so.1.2.9 => /usr/local/lib/libtorrent.so.1.2.9 (0x00007f3b6cf56000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3b6cd37000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3b6c9ae000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f3b6c796000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3b6c3a5000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3b6dd12000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3b6c007000)

更新

好的,在我进行此更改后,它会编译

add_library(tstreamer SHARED tstreamer.cpp)
target_link_libraries(tstreamer PRIVATE torrent PUBLIC pthread)

add_executable(test main.cpp **tstreamer.h**)
target_link_libraries(test tstreamer)

标签: c++cmakelinker

解决方案


推荐阅读