Cmake undefined reference to symbol 'dlsym@@GLIBC_2.2.5 即使我使用 -ldl link
Cmake undefined reference to symbol 'dlsym@@GLIBC_2.2.5 even though I link with -ldl
我得到了对 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
来做到这一点的
你会仔细检查用于linking 的实际命令行,你会发现after libsmoltcp_cpp_interface_rust.a
, 漏掉符号, 有没有 -ldl
参数.
您的情况 smoltcp_cpp
似乎是一个导入的库 target,其中 libsmoltcp_cpp_interface_rust.a
作为 link依赖(不像IMPORTED_LOCATION
属性左右)。
虽然 CMake 保留库的顺序,linked 到 单个 二进制文件(一个或另一个库),顺序在 dependencies[=这些库中的 51=] 个未定义。
您需要将 -ldl
添加为 smoltcp_cpp
目标本身的 link 依赖项:
target_link_libraries(smoltcp_cpp INTERFACE -ldl)
但是,只有当 libsmoltcp_cpp_interface_rust.a
是 smoltcp_cpp
目标的 直接 link 依赖项时,这才有效,即指定为
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 目标都应该自包含,因此您可以安全地link使用该目标而无需了解其内部结构。
我得到了对 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
你会仔细检查用于linking 的实际命令行,你会发现after libsmoltcp_cpp_interface_rust.a
, 漏掉符号, 有没有 -ldl
参数.
您的情况 smoltcp_cpp
似乎是一个导入的库 target,其中 libsmoltcp_cpp_interface_rust.a
作为 link依赖(不像IMPORTED_LOCATION
属性左右)。
虽然 CMake 保留库的顺序,linked 到 单个 二进制文件(一个或另一个库),顺序在 dependencies[=这些库中的 51=] 个未定义。
您需要将 -ldl
添加为 smoltcp_cpp
目标本身的 link 依赖项:
target_link_libraries(smoltcp_cpp INTERFACE -ldl)
但是,只有当 libsmoltcp_cpp_interface_rust.a
是 smoltcp_cpp
目标的 直接 link 依赖项时,这才有效,即指定为
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 目标都应该自包含,因此您可以安全地link使用该目标而无需了解其内部结构。