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

标签 gcc linker ld

这些命令行选项的用途是什么?请帮忙解读以下命令行的含义:

-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

-( archives -) or --start-group archives --end-group

The archives should be a list of archive files. They may be either explicit file names, or -l options.

The specified archives are searched repeatedly until no new undefined references are created. Normally, an archive is searched only once in the order that it is specified on the command line. If a symbol in that archive is needed to resolve an undefined symbol referred to by an object in an archive that appears later on the command line, the linker would not be able to resolve that reference. By grouping the archives, they all be searched repeatedly until all possible references are resolved.

Using this option has a significant performance cost. It is best to use it only when there are unavoidable circular references between two or more archives.

因此,组内的库可以多次搜索新符号,并且您不需要像 -llib1 -llib2 -llib1 这样的丑陋结构

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

关于gcc - --start-group 和 --end-group 命令行选项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5651869/

相关文章:

使用结构接口(interface)和附加 C 文件在 main 中调用 C 函数

ios - 如何解决架构 i386 的 undefined symbol

C float 0x1.fp3

c - 使用内联组件绘制像素 VGA

c++ - 链接器命令失败,退出代码为 1 - Xcode

c++ - 让我们分析一下 "collect2: ld returned 1 exit status"?

macos - 在 Mac OSX 上使用 NASM 和 ld

gcc - 有没有更有效的方法将 4 个连续的 double 广播到 4 个 YMM 寄存器中?

c++ - sstream : No such file or directory

c++ - 与 Boost 错误链接