--start-group和--end-group命令行选项是什么?


83

这些命令行选项的目的是什么?请帮助解释以下命令行的含义:

-Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib

显然,它与链接有关,但是GNU手册对分组的含义很安静。

Answers:


95

它用于解决几个库之间的循环依赖关系(在-(和之间列出-))。

引用为什么链接库的顺序有时会导致GCC错误?man ld http://linux.die.net/man/1/ld

-( 档案 -)--start-group 档案 --end-group

档案应该是一个存档文件的列表。它们可以是显式文件名,也可以是-l选项。

重复搜索指定的档案,直到没有创建新的未定义引用。通常,仅按在命令行上指定的顺序搜索一次存档。如果需要该归档文件中的符号来解析由归档文件中的对象引用的未定义符号(稍后在命令行中显示),则链接程序将无法解析该引用。通过对档案进行分组,可以重复搜索所有档案,直到解析所有可能的参考。

使用此选项会产生很大的性能成本。最好仅在两个或多个归档之间存在不可避免的循环引用时使用。

因此,可以多次搜索组内的库中的新符号,而无需像 -llib1 -llib2 -llib1

PS存档基本上意味着一个静态库(*.a文件)


1
公认。备注:我相信GCC首先会使用动态库,除非在命令行中传递了完整的文件名(包括路径和.a后缀)。-llib1将导致GCC首先尝试链接到%.so文件,然后再尝试%.a文件。
pic11 2011年

1
@ pic11,谢谢。链接是由ld完成的,您可以看到如何-Wl,--verbose在gcc中添加选项来搜索库(它将传递--verbose给链接器ld)。例如-ltest图书馆:attempt to open /lib/libtest.so failed \n attempt to open /lib/libtest.a failed \n attempt to open /usr/lib/libtest.so failed \n attempt to open /usr/lib/libtest.a failed \n 。链接器尝试先打开.so,然后再尝试打开.a。它在库搜索目录的每个目录中完成。
osgx 2011年

“多次搜索新符号”?我认为搜索两次足以解决所有符号。这应该不会是一个显著的性能成本。
Jimm Chen 2012年

9
抱歉,我终于意识到“搜索两次”是不够的。
Jimm Chen'5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.