将错误与" -Wl链接, - no-undefined -Wl, - no-allow-shlib-undefined"

时间:2014-04-23 05:01:59

标签: c++ gcc linker

使用标志" -Wl, - no-undefined -Wl, - no-allow-shlib-undefined"使用GCC导致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生成编译命令)

1 个答案:

答案 0 :(得分:2)

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

这第二个参数涉及构建时间检查,其中启用这意味着检查您链接的库依次在构建时连接其依赖关系。并且情况不一定如此。

第一个参数确保您没有忘记声明对运行时库的依赖(它也可能是运行时库对另一个运行时库的依赖)。例如,如果您正在调用一个实现的函数在一个示例运行时库" libfunc.so"然后该库将调用另一个运行时库中的函数" libext.so"然后通过声明依赖于" func"和"分机"将生成libfunc.so以在内部包含对libext的依赖引用。 如果你遗漏了" - 没有未定义的"并且忘记添加依赖声明,然后构建仍然会成功,相信您的运行时链接器将在运行时解析依赖项。而且由于构建成功,您可能相信一切都可以,不知道构建是否延迟了对运行时链接程序的责任。但是大多数情况下,运行时链接程序并不是为了搜索未解析的引用而设计的,而是希望找到运行时库中声明的这种依赖关系。如果没有这样的引用,您将收到运行时错误。运行时错误通常比解决编译时错误要贵得多。