- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我收到了对 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>
的依赖项.
关于c++ - 即使我与 -ldl 链接,Cmake 对符号 'dlsym@@GLIBC_2.2.5 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63153342/
是否可以使用 dlsym 从框架加载已命名的未导出符号? ? 我尝试导入的符号有一个名称,在框架内引用它。这是我需要调用的函数。 我正在尝试照常进行 dlopen + dlsym方式,但是当我尝试加载
我收到此链接器错误: system/core/libacc/tests/main.cpp:42: error: undefined reference to 'dlsym' 您能告诉我 ubuntu
我使用 dlsym() 来调用我的 malloc 版本,而不是默认库 malloc: lt_malloc = (void*(*)(size_t))dlsym(RTLD_NEXT, "malloc")
1).直接打印函数地址: printf("strerror=%p, strerror_r=%p\n", strerror, strerror_r); strerror=0x8049ec0, strer
所以我一直试图从本地 dylib 获取符号,但每当我尝试做任何事情时,我都会遇到段错误,我不确定为什么会发生这种情况。我已经在其他程序中看到过这样做并且它们工作正常,所以我知道它有效但我似乎无法做到:
我真的很讨厌在这里提问。但我一直在看some of the other posts ,并且诸如此类的解决方案似乎不起作用。这可能是我对语法的误解。 我正在改进我的一些旧代码。问题中的函数循环通过一些加
作为 malloc 包装器,我使用了这段经典的代码片段: #define _GNU_SOURCE #include #include #include void* malloc(size_t s
我正在用 C 编写一个插件应用程序,我正在使用 dlopen/dlsym 动态加载某些功能的“实现”。例如,我有以下指向函数的指针 struct cti_t* (*create)() = 0; 然后我
我使用 dlopen 在我的程序中加载 pthread 库,并使用 dlsym 获取处理程序到 pthread_create 和 pthread_join >. 如何确保两个处理程序的版本兼容?我不在
man page dlsym() 列表 *(void **) (&cosine) = dlsym(handle, "cos"); 作为转换 dlsym() 返回值的解决方法。 这里的*(void
我在 C 中使用 dlsym() 我有一个问题 dlsym() 的返回值是否应该显式转换或者它是否被正确地隐式转换。这是函数: double (*(compile)(void))(double x,
我有一个动态加载库的应用程序,它动态加载库... 在 Windows 中,我能够遍历所有加载的模块以查找我感兴趣的符号。不知道如何在 Unix/Linux 环境中执行此操作。我知道我可以对前两个符号使
奇怪的是 dlsym 可以从剥离的二进制文件中导入函数。 谁能告诉我为什么/怎么做? === FILE: a.c === int a1() { return 1; } int a2() { retur
我正在尝试使用 Qt 5.3.0 在 Linux Mint 17 中编译 C++ 程序。我已将以下行添加到 .pro 文件中: QMAKE_LFLAGS += -ldl -fPIC 我的程序使用了 d
我正在使用 POSIX dlopen/dlsym API 在运行时加载动态库,然后按名称从这些库中调用函数。 存储 dlsym 的结果在性能方面是个好主意吗?某处?或者 dlsym 是否已经进行了自己
有没有跑路的希望dlopen(NULL, ...)并为静态编译的二进制文件获取符号? 例如,使用以下代码,如果程序是动态编译的并且我使用 -rdynamic,我可以获得符号。 . $ gcc -o f
我正在从共享对象 (a.so) 调用函数。我使用 dlopen 加载 a.so 并使用 dlsym 加载映射函数。 int (*funcPtr)() = reinterpret_cast(dl
我正在尝试使用 dlsym() 在 libcrypto.so 文件中查找 connect 符号,并希望用我的方法替换此 connect 。 void * lib_orig_tols = dlopen
我想从我的共享库 (.so) 中访问一个类符号这是我需要做的正确方法吗? MyClass* pMyClass= (MyClass*)dlsym(phandle, "MyClass"); 如果这是正确的
dlsym为枚举值返回 null NSLog(@"%s",dlsym(RTLD_DEFAULT, "NSTextAlignmentCenter")); 输出 2014-01-28 13:07:04.2
我是一名优秀的程序员,十分优秀!