gpt4 book ai didi

c++ - 链接错误 "-Wl,--no-undefined -Wl,--no-allow-shlib-undefined"

转载 作者:行者123 更新时间:2023-11-30 04:05:34 27 4
gpt4 key购买 nike

在 GCC 中使用标志“-Wl,--no-undefined -Wl,--no-allow-shlib-undefined”会导致 Travis CI 镜像出现以下编译错误,但不会出现在我的机器上(两者都是 Ubuntu 12.04 64 位):

Linking CXX shared library libmocap.so
cd /tmp/_travis/build/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/mocap.dir/link.txt --verbose=1
/usr/bin/g++ -fPIC --coverage -Werror -pedantic -Wno-long-long -Wall -Wextra -Wcast-align -Wcast-qual -Wformat -Wwrite-strings -Wconversion -fvisibility=hidden -Wl,--no-undefined -Wl,--no-allow-shlib-undefined -Wl,--as-needed -shared -Wl,-soname,libmocap.so.0.0.0 -o libmocap.so.UNKNOWN CMakeFiles/mocap.dir/abstract-marker.cc.o CMakeFiles/mocap.dir/abstract-virtual-marker.cc.o CMakeFiles/mocap.dir/color.cc.o CMakeFiles/mocap.dir/link.cc.o CMakeFiles/mocap.dir/marker-set-factory.cc.o CMakeFiles/mocap.dir/marker-set.cc.o CMakeFiles/mocap.dir/marker-trajectory-factory.cc.o CMakeFiles/mocap.dir/marker-trajectory.cc.o CMakeFiles/mocap.dir/marker.cc.o CMakeFiles/mocap.dir/mars-marker-set-factory.cc.o CMakeFiles/mocap.dir/math.cc.o CMakeFiles/mocap.dir/pose.cc.o CMakeFiles/mocap.dir/segment.cc.o CMakeFiles/mocap.dir/string.cc.o CMakeFiles/mocap.dir/trc-marker-trajectory-factory.cc.o CMakeFiles/mocap.dir/virtual-marker-one-point-measured.cc.o CMakeFiles/mocap.dir/virtual-marker-relative-to-bone.cc.o CMakeFiles/mocap.dir/virtual-marker-three-points-measured.cc.o CMakeFiles/mocap.dir/virtual-marker-three-points-ratio.cc.o CMakeFiles/mocap.dir/virtual-marker-two-points-measured.cc.o CMakeFiles/mocap.dir/virtual-marker-two-points-ratio.cc.o
/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `_dl_argv@GLIBC_PRIVATE'
/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `_rtld_global_ro@GLIBC_PRIVATE'
/usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.so: undefined reference to `__tls_get_addr@GLIBC_2.3'
/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `_rtld_global@GLIBC_PRIVATE'
/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `__libc_enable_secure@GLIBC_PRIVATE'
collect2: ld returned 1 exit status
make[2]: *** [src/libmocap.so.UNKNOWN] Error 1

奇怪的是,这不会发生在我的机器上,因此有点难以重现。启用这些标志时,链接 libc 和 libstdc++ 的正确方法是什么?

(正如您从输出中猜到的,我使用 CMake 生成编译命令)

最佳答案

第二个参数的默认值是“--allow-shlib-undefined”。如果您选择该选项,代码可能会构建。

第二个参数涉及构建时检查,启用这意味着检查您要链接的库是否在构建时连接了它的依赖项……但情况不一定如此。

第一个参数确保您没有忘记声明对运行时库的依赖性(这也可能是运行时库对另一个运行时库的依赖性)。例如,如果您正在调用实现的函数在示例运行时库“libfunc.so”中,该库将依次调用另一个运行时库“libext.so”中的函数,然后通过声明对“func”和“ext”的依赖,将生成 libfunc.so在内部包含对 libext 的依赖引用。如果您省略“--no undefined”并忘记添加依赖项声明,那么构建仍然会成功,相信您的运行时链接器会在运行时解析依赖项。由于构建成功,您可能会相信一切都会好起来,而不知道构建已将责任推给了运行时链接器。但大多数情况下,运行时链接器并非旨在搜索未解析的引用,而是希望找到运行时库中声明的此类依赖项。如果没有这样的引用,您将收到运行时错误。运行时错误的代价通常比解决编译时错误的代价高得多。

关于c++ - 链接错误 "-Wl,--no-undefined -Wl,--no-allow-shlib-undefined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23235114/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com