对于我的一个二进制文件,CMake生成如下所示的cmdline:
/opt/rh/devtoolset-8/root/usr/bin/g++
-O3 -DNDEBUG
-s
-Wl,--as-needed
-Wl,--gc-sections
<blah-blah>.o
...
-o procmon.e
-Wl,-rpath,/usr/local/lib64
<my lib>.a
...
/usr/local/lib64/libxalan-c.so
/usr/local/lib64/libxerces-c.so
/home/user/vcpkg/installed/x64-linux/lib/libcurl.a
...
-lcrypt
<more vcpkg static libs>
-lrt
-lpthread
<more vcpkg static libs>
-lm
<more vcpkg static libs>
-ldl
<more vcpkg static libs>
-pthread
<more vcpkg static libs>
如您所见,已指定--as-needed
,但最终仍然有未使用的依赖项:
$ ldd -u -r procmon.e
Unused direct dependencies:
/usr/local/lib64/libxalan-c.so.111
/lib64/libcrypt.so.1
/lib64/libm.so.6
为什么?
答案 0 :(得分:0)
--as-needed
在链接阶段通过忽略无法解析任何当前未知符号的共享库(当前正在处理)来工作。在此之后,将开始对节(--gc-sections
)进行垃圾收集,这可能导致删除使用给定的共享库(在上一步中)解决的所有符号引用,从而导致原始帖子中提到的行为。
Here is其他一些阅读内容。