我收到未定义的引用dlsym@@GLIBC_2.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
你能仔细检查一下吗实际的命令行用于链接,你会发现after libsmoltcp_cpp_interface_rust.a
,其中缺少符号,有no -ldl
范围。
看来你的情况smoltcp_cpp
是一个导入的库target, 其中有libsmoltcp_cpp_interface_rust.a
as a 链接依赖(不作为IMPORTED_LOCATION
财产等)。
虽然 CMake 保留了库的顺序,但链接到single二进制(一个或另一个库),之间的顺序依赖关系这些库的未定义。
你需要添加-ldl
作为链接依赖项smoltcp_cpp
目标本身:
target_link_libraries(smoltcp_cpp INTERFACE -ldl)
但是,这仅在以下情况下才有效:libsmoltcp_cpp_interface_rust.a
is a direct链接依赖性smoltcp_cpp
目标,指定为
target_link_libraries(smoltcp_cpp INTERFACE libsmoltcp_cpp_interface_rust.a)
的情况下indirect依赖关系,例如
target_link_libraries(smoltcp_cpp INTERFACE <intermediate-target>)
target_link_libraries(<intermediate-target> INTERFACE libsmoltcp_cpp_interface_rust.a)
你需要添加-ldl
作为它的依赖<intermediate-target>
.
理想情况下,每个 IMPORTED 目标都应该是独立的,因此您可以安全地链接到该目标,而无需了解其内部结构。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)