当前位置: 首页 > 知识库问答 >
问题:

Cmake对符号'dlsym@@glibc2.2.5的未定义引用,即使我链接到-ldl

谭安翔
2023-03-14

我得到了对dlsym@@glibc2.2.5的未定义引用,即使将其链接在库前后。 然而,在链接输出中,它似乎是在链接之前,但链接之前所有的库应该工作,我猜。

/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库没有依赖项,它们只是缺少符号,我们必须填充它们。 似乎我是通过链接-ldl来实现这一点的

共有1个答案

戚修雅
2023-03-14

如果仔细检查用于链接的实际命令行,您会发现在libsmoltcp_cpp_interface_rust.a(缺少符号)后面没有-ldl参数

在您的示例中,smoltcp_cpp似乎是一个导入的库目标,它将libsmoltcp_cpp_interface_rust.a作为链接依赖项(而不是imported_location属性)。

虽然CMake保留链接到单个二进制文件(一个或另一个库)中的库的顺序,但这些库的依赖项之间的顺序没有定义。

您需要将-LDL添加为smoltcp_cpp目标本身的链接依赖项:

target_link_libraries(smoltcp_cpp INTERFACE -ldl)

但是,只有当libsmoltcp_cpp_interface_rust.asmoltcp_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添加为该 的依赖项。

理想情况下,每个导入的目标都应该是自包含的,因此您可以安全地与该目标链接,而无需了解其内部结构。

 类似资料:
  • 如有任何线索将不胜感激。 换了cmakelists后我又遇到了一个问题

  • 问题内容: 我正在使用和编译选项。我已经尝试了所有: 但是错误: 在所有情况下都会发生。 问题答案: 将放在行尾。 gcc按照在命令行上出现的顺序处理为最终程序指定输入的参数。该参数被传递给链接器和参数,例如,被编译,并且将所得的目标文件被传递给链接器。 链接器还按顺序处理输入。当看到指定的库时,它会查看该库是否提供 了链接器当前需要的 任何符号。如果是这样,它将从库中复制带有这些符号的模块,并将

  • 问题内容: 这有什么问题吗?我有以下简单的课程: 在运行一个简单的compile()之后,出现以下错误: 在共享库上运行nm表示实际上已找到它: 这是在Ubuntu 12.04上发生的。该 libmnl-dev的 和 libmnl0 包安装。的输出表明正使用该* .so文件: 问题答案: 库必须在使用它们的对象之后列出(更确切地说,仅当库包含满足遇到未定义引用的符号时,才使用库)。将移至命令末尾。

  • 我正试图在Ubuntu 20.04上集成librealsense C CLion项目。< br >在终端中单独编译Librealsense可以正常工作。 项目如下所示: 克马尔主义者。基本文件夹中的txt看起来相当简单: 当我试图将子模块包含到我的CLion项目中时,我得到了大量的:< code>main.cpp:(。text 0x23c):对glViewport错误消息的未定义引用,在基目录中构

  • 我试图加载一个. so文件(libInfExprParser.so)使用JNI。我没有这个共享对象的源代码。我得到以下错误: 线程“main”java中出现异常。lang.unsatifiedlinkerror:/home/tomcat/sahiti/ExprParser/libinfexparser。所以:/home/tomcat/sahiti/ExprParser/libinexprparse

  • 问题内容: 我可以毫无问题地创建一个共享库。我创建了libcbitcoin.so(没有错误),并尝试通过可执行文件以及OpenSSL库与之链接。我使用以下命令: bin目录是库的位置。obj目录包含我希望链接到可执行文件的目标文件。在命令中,我使用-L,-l和- rpath选项,我认为这是在Linux中进行链接所需的全部。由于出现类似以下的错误,看来我错了: 在库中找到CBNewByteArray

  • 可能重复: 什么是未定义的引用/未解决的外部符号错误,如何修复? 试图通过 我得到一个错误: main.cpp 搞砸h文件: 有什么想法吗?使用此函数构建具有设置大小的哈希表。 编辑:散列。cpp文件 正在尝试通过以下终端进行编译: g-c Hash.cpp-o Hash. o g-omain.cpphash. o-std=c 0x 不知怎的,它进入了一个无限循环。

  • 我正在尝试使用AassetManager从android apk访问资产。然而,尽管我已经包含了asset_manager.h和asset_manager_jni.h,但我仍然得到了“对aassetmanager_fromjava的未定义引用”。其他来自asset_manager.h的函数,如AAssetManager_openDir(mgr,"“)等也不能被引用。 以下是完整的代码 这段代码在一