c++ - 即使我与 -ldl 链接,Cmake 对符号 'dlsym@@GLIBC_2.2.5 的 undefined reference

标签 c++ cmake dependencies shared-libraries

我收到了对 dlsym@@GLIBC_2.2.5 的 undefined reference 即使在库之前和之后链接它之后。然而,在链接输出中,它似乎是在之前链接,但在所有库都应该工作之前链接,我猜。

/bin/g++-9     CMakeFiles/http_downloader.dir/http_downloader_cli.cpp.o CMakeFiles/http_downloader.dir/SimpleOpenVPNSocket.cpp.o  -o http_downloader  -lpthread /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/x86_64-linux-gnu/liblz4.so -ldl downloader/libhttp_downloader_cli.a downloader/libhttp_downloader_lib.a ../../libopenvpn/libopenvpn_lib.a ../../_smoltcp_cpp_interface/libsmoltcp_cpp.a ../../_libtins/lib/libtins.a -ldl /usr/lib/x86_64-linux-gnu/libcrypto.so -lpthread /usr/lib/x86_64-linux-gnu/liblz4.so /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/x86_64-linux-gnu/libcrypto.so ../../../../smoltcp_cpp_interface/target/debug/libsmoltcp_cpp_interface_rust.a /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/x86_64-linux-gnu/libcrypto.so 
/usr/bin/ld: ../../../../smoltcp_cpp_interface/target/debug/libsmoltcp_cpp_interface_rust.a(std-6640d3868fa846e8.std.1mk5kra7-cgu.0.rcgu.o): undefined reference to symbol 'dlsym@@GLIBC_2.2.5'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libdl.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [src/examples/http_downloader/CMakeFiles/http_downloader.dir/build.make:113: src/examples/http_downloader/http_downloader] Error 1
make[2]: Leaving directory '/workspaces/libopenvpnclient/build'
make[1]: *** [CMakeFiles/Makefile2:519: src/examples/http_downloader/CMakeFiles/http_downloader.dir/all] Error 2
make[1]: Leaving directory '/workspaces/libopenvpnclient/build'
make: *** [Makefile:130: all] Error 2
这就是我在 CMake 中链接它的方式:
add_executable(http_downloader http_downloader_cli.cpp SimpleOpenVPNSocket.cpp)
add_core_dependencies(http_downloader)

target_include_directories(http_downloader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/downloader/include)
add_dependencies(http_downloader http_downloader_cli http_downloader_lib openvpn_lib smoltcp_cpp tins)
set_property(TARGET http_downloader PROPERTY CXX_STANDARD 17)
target_link_libraries(http_downloader dl http_downloader_cli http_downloader_lib openvpn_lib smoltcp_cpp tins dl)
正如你所看到的,我已经把 dl之前和之后的一切只是为了确保。
如果我理解正确,.a libs 没有依赖关系,它们只有缺失的符号,我们必须填充它们。似乎我是通过与 -ldl 链接来做到这一点的

最佳答案

你会仔细检查吗?实际命令行 用于链接,你会发现 libsmoltcp_cpp_interface_rust.a ,漏掉了符号,还有 -ldl范围。
看来你的情况smoltcp_cpp是一个导入的库 目标 ,其中有 libsmoltcp_cpp_interface_rust.a作为 链接依赖 (不是 IMPORTED_LOCATION 属性(property)左右)。
虽然 CMake 保留了库的顺序,但链接到 单例二进制(一个或另一个库),顺序在 之间依赖项 未定义这些库。
您需要添加 -ldl作为 smoltcp_cpp 的链接依赖项目标本身:

target_link_libraries(smoltcp_cpp INTERFACE -ldl)

但是,这仅适用于 libsmoltcp_cpp_interface_rust.a直销 smoltcp_cpp 的链接依赖项目标,即指定为
target_link_libraries(smoltcp_cpp INTERFACE libsmoltcp_cpp_interface_rust.a)
在间接依赖的情况下,例如
target_link_libraries(smoltcp_cpp INTERFACE <intermediate-target>)
target_link_libraries(<intermediate-target> INTERFACE libsmoltcp_cpp_interface_rust.a)
您需要添加 -ldl作为该 <intermediate-target> 的依赖项.
理想情况下,每个 IMPORTED 目标应该是 独立 ,因此您可以在不知道其内部结构的情况下安全地链接到该目标。

关于c++ - 即使我与 -ldl 链接,Cmake 对符号 'dlsym@@GLIBC_2.2.5 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63153342/

相关文章:

c++ - 使用 CMake 为 Fedora 23 构建 SFML 时出错 [xcb-image not found]

android - Gradle 和 Google Cast 的 transient 依赖

c++ - Mat.inv() 在 opencv 中产生全零

C++ 推断尖括号内类型的模板参数

c++ - 什么时候必须用 C 语言链接库?

c++ - 如何访问整数指针中的每个字节?

cmake - 调试cmake,变量在哪里定义?

c++ - cmake找不到 “OPENCV”提供的程序包配置文件

graph - 解决依赖关系和冲突的图(可能包含循环)

java - 使用Java Webstart部署时的依赖问题