c++ - 为什么链接器无法解析符号?
问题描述
无法弄清楚问题出在哪里。我有一个使用 Cmake 的 CLion 项目。
我有两个主要目标
- tstreamer - 是一个共享库,巫婆依赖于 libtorrent 并包装它
add_library(tstreamer SHARED tstreamer.cpp)
target_link_libraries(tstreamer PRIVATE torrent PUBLIC pthread)
- 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)
解决方案
推荐阅读
- django - 如何在 Django 多对多(通过)关系中删除中间模型的单个实例?
- vba - 将行从 1 个源工作表复制到与工作表名称匹配的工作表
- angular - Angular 5 可链接的 API 调用以获取巨大的对象,并将进度报告给 UI
- python - Selenium 无法打开新窗口/选项卡
- laravel - 通过关系 Laravel 访问数据
- reactjs - 使用 Intellij 创建 React 应用程序
- php - 锚标签 Mailto:不工作 PHP WordPress
- c# - 在 SQL 参数值周围添加引号?
- signal-processing - 如何使用 LogiCORE DSP48 宏?
- c# - 两个具有相同值的不同字符串实例如何存储在堆中?