我使用GCC编译了包含在CFLAGS
中的-O3 -fast-math
的一些C代码。我很困惑在链接时是否也将这些标志传递给GCC,即将-Wl,-O3 -Wl,-fast-math
放置在LDLIBS
中。给予GCC连接器的优化标志的效果
确切地说-Wl,<...>
是做什么的,为什么我们需要在CFLAGS
和LDLIBS
中通过相同的选项?
此外,有没有任何特定于平台的链接器相对于这些标志进入链接器的行为?
我使用GCC编译了包含在CFLAGS
中的-O3 -fast-math
的一些C代码。我很困惑在链接时是否也将这些标志传递给GCC,即将-Wl,-O3 -Wl,-fast-math
放置在LDLIBS
中。给予GCC连接器的优化标志的效果
确切地说-Wl,<...>
是做什么的,为什么我们需要在CFLAGS
和LDLIBS
中通过相同的选项?
此外,有没有任何特定于平台的链接器相对于这些标志进入链接器的行为?
选项-Wl,...
指导GCC传递...
直经为 链接,ld
,如果调用链接。
编译器优化选项-O0, -O1
等不被链接器 识别,如果通过则忽略。编译器优化选项 -ffast-math
与不相关的ld
选项-f<so_name>
, 发生冲突,链接器仅接受-shared
。因此 如果-shared
不通过,一个ld
使用错误的结果:
/usr/bin/ld: -f may not be used without -shared
并且如果-shared
通过,则fast-math
将被误解 作为<so_name>
。如果传递给ld
,则 表-f...
的任何其他编译器选项也适用。
这里是the GCC commandline options reference 这里是一个 GNU ld
如果用GNU建设作出,本作变量LDLIBS
是连接库选项(-l...
)常规 保留。其他链接选项 在LDFLAGS
通常通过查看来自binutils的(包括BFD和黄金)this answer
链接器不认识'-O'选择,他们确实有一定的效果,但一个相当小的一个。 –