【发布时间】:2011-08-04 20:15:40
【问题描述】:
这些命令行选项的用途是什么?请帮助破译以下命令行的含义:
-Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib
显然它与链接有关,但 GNU 手册并没有说明分组的确切含义。
【问题讨论】:
这些命令行选项的用途是什么?请帮助破译以下命令行的含义:
-Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib
显然它与链接有关,但 GNU 手册并没有说明分组的确切含义。
【问题讨论】:
它用于解决几个库之间的循环依赖(在-( 和-) 之间列出)。
引用Why does the order in which libraries are linked sometimes cause errors in 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。它在库搜索目录中的每个目录中完成。