gpt4 book ai didi

c++ - 如果链接到未使用的库,可执行文件的构建是否不同?

转载 作者:可可西里 更新时间:2023-11-01 15:52:27 25 4
gpt4 key购买 nike

除了更长的编译时间之外,链接未使用的库还有什么缺点吗?

例如,使用以下两种方式之一编译的程序的可执行文件是否有任何区别:

g++ -o main main.cpp
g++ -o main main.cpp -llib1 -llib2 -llib3 -lmore

*构建 main 实际上不需要任何库文件。

我认为这没有什么区别,因为文件大小相同,但我要求确认。

最佳答案

视情况而定。

  1. 如果liblib1.aliblib2.aliblib3.a是静态库,没有使用任何符号他们,那就没有区别了。

  2. 如果liblib1.soliblib2.soliblib3.so 是共享库,那么它们将在运行时它们是否被使用。您可以使用链接器标志 --as-needed 来更改此行为,建议使用此标志。

要检查您的二进制文件在运行时直接加载了哪些共享库,在 ELF 系统上您可以使用 readelf

$ cat main.cint main(){    return 0;}$ gcc main.c$ readelf -d a.out | grep NEEDED 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]$ gcc -lpng main.c$ readelf -d a.out | grep NEEDED 0x0000000000000001 (NEEDED)             Shared library: [libpng12.so.0] 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

您可以在我的系统上看到,-lpng 链接到 libpng12.so.0,无论它的符号是否实际被使用。 --as-needed 链接器标志修复了这个问题:

$ gcc -Wl,--as-needed -lpng main.c$ readelf -d a.out | grep NEEDED 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

注意事项

  1. --as-needed 标志必须在库之前指定。它只影响出现在它之后的库。所以 gcc -lpng -Wl,--as-needed 不起作用。

  2. ldd 命令不仅列出二进制文件直接链接的库,还列出所有间接依赖项。这可能会根据这些库的编译方式而改变。只有 readelf 会显示您的直接依赖关系,只有 ldd 会显示您的间接依赖关系。

关于c++ - 如果链接到未使用的库,可执行文件的构建是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13984180/

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