这些命令行选项的目的是什么?请帮忙解释以下命令行的含义:
-Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib
显然这与链接有关,但GNU手册并没有明确说明“grouping”具体指什么。
这是为了解决在几个库(列在-(
和-)
之间)之间的循环依赖关系。
引用为什么链接库的顺序有时会导致GCC出错?或者man ld
http://linux.die.net/man/1/ld
-(
存档文件列表-)
或--start-group
存档文件列表--end-group
存档文件列表应该是一个存档文件列表。它们可能是显式文件名,也可能是-l选项。
指定的存档文件将被反复搜索,直到不再创建新的未定义引用为止。通常情况下,存档文件只按照命令行上指定的顺序搜索一次。如果命令行上后面的一个存档中的符号需要解析前面一个存档中的未定义符号,那么链接器将无法解析该引用。通过对存档进行分组,所有存档都将被反复搜索,直到解析所有可能的符号引用为止。
使用此选项会带来显著的性能损失。最好只在两个或多个存档之间存在不可避免的循环引用时才使用它。
因此,在组内的库可以被反复搜索新的符号,而且您不需要像-llib1 -llib2 -llib1
这样的丑陋结构。
PS 存档基本上是静态库(*.a
文件)
-Wl,--verbose
选项来查看如何搜索库(它将把--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