0

我有一些-f编译器选项,不久前有人建议我也将这些选项放入,CFLAGS所以我这样做了。它没有引起任何问题。-fsanitize=addressLDFLAGS

我的问题是我怎样才能知道哪些编译器选项CFLAGS也应该进入LDFLAGS?它只是-f前缀选项吗?谢谢

4

1 回答 1

1

我在 CFLAGS 中有一些 -f 编译器选项,例如 -fsanitize=address,不久前有人建议我也将这些选项放在 LDFLAGS 中,所以我这样做了。它没有引起任何问题。

它不仅不会引起任何问题,而且这是构建经过清理的程序的唯一正确方法。

我的问题是如何判断 CFLAGS 中的哪些编译器选项也应该放入 LDFLAGS 中?它只是 -f 前缀选项吗?

如果你只是这样做就不会受到伤害

LDFLAGS = $(CFLAGS) $(LIBS)

编译器驱动程序 ( /usr/bin/gcc) 知道哪些高级选项适用于链接器,因此将简单地过滤掉不必要的选项。如果您想知道这是怎么发生的,请使用-dumpspecs以下标志运行 gcc:

$ gcc -dumpspecs
...
*link_command:
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:    %(linker) %{!fno-use-linker-plugin:%{!fno-lto:     -plugin %(linker_plugin_file)     -plugin-opt=%(lto_wrapper)     -plugin-opt=-fresolution=%u.res     %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}}     }}%{flto|flto=*:%<fcompare-debug*}     %{flto} %{fno-lto} %{flto=*} %l %{no-pie:} %{pie:-pie} ...

这看起来有点难看,但实际上这只是一种用于标志翻译的迷你语言。此处提供了语法详细信息(尽管我严重怀疑您是否需要了解它们)。

于 2017-03-20T20:56:06.070 回答