- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
除了更长的编译时间之外,链接未使用的库还有什么缺点吗?
例如,使用以下两种方式之一编译的程序的可执行文件是否有任何区别:
g++ -o main main.cpp
g++ -o main main.cpp -llib1 -llib2 -llib3 -lmore
*构建 main 实际上不需要任何库文件。
我认为这没有什么区别,因为文件大小相同,但我要求确认。
最佳答案
视情况而定。
如果liblib1.a
、liblib2.a
、liblib3.a
是静态库,没有使用任何符号他们,那就没有区别了。
如果liblib1.so
、liblib2.so
或liblib3.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]
--as-needed
标志必须在库之前指定。它只影响出现在它之后的库。所以 gcc -lpng -Wl,--as-needed
不起作用。
ldd
命令不仅列出二进制文件直接链接的库,还列出所有间接依赖项。这可能会根据这些库的编译方式而改变。只有 readelf
会显示您的直接依赖关系,只有 ldd
会显示您的间接依赖关系。
关于c++ - 如果链接到未使用的库,可执行文件的构建是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13984180/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!