如何解决为什么链接器无法解析符号?
无法找出问题所在。 我有一个使用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依赖两次-一个用于我共享的lib,另一个用于测试二进制文件?
编译测试二进制文件的命令是
/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
在tstreamer的所有ldd都说完之后,为什么链接器无法确定是否需要libtorrent。
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。