是否可以从 gcc 的源代码中确定或设置编译器选项?
Posted
技术标签:
【中文标题】是否可以从 gcc 的源代码中确定或设置编译器选项?【英文标题】:Is it possible to determine or set compiler options from within the source code in gcc? 【发布时间】:2014-09-03 16:25:39 【问题描述】:我有一些代码需要某个 gcc 编译器选项(否则它不会编译)。当然,我可以确保在 makefile 中为这个特定的源文件设置了所需的选项。但是,如果可以在 source_file.cpp
中为相应的编译单元(或其中的一部分)设置此选项,则会更有帮助。
我知道可以使用#pragma GCC diagnostic
打开或关闭警告消息,但是-fsomething
类型的选项呢?我从this question 那里得知这是不可能的。
但也许至少有一种方法可以从代码中检查某个 -f
选项是否打开?
注意我对从二进制文件as was asked previously 或命令行中查找编译器标志不感兴趣。
【问题讨论】:
您对哪个选项感兴趣? @OregonTrail-fext-numeric-literals
,当使用 GNU 扩展 __float128
和 std=c++11
(而不是 std=gnu++11
)时需要。
【参考方案1】:
根据我的经验,不会。这不是你做这件事的方式。相反,您将编译器/平台/操作系统特定的代码放在源代码中,并用适当的ifdef
语句包装它。其中包括:
#ifdef __GNUC__
/*code for GNU C compiler */
#elif _MSC_VER
/*usually has the version number in _MSC_VER*/
/*code specific to MSVC compiler*/
#elif __BORLANDC__
/*code specific to borland compilers*/
#elif __MINGW32__
/*code specific to mingw compilers*/
#endif
在此,您可以有特定于版本的要求和代码:
#ifdef __GNUC__
# include <features.h>
# if __GNUC_PREREQ(4,0)
// If gcc_version >= 4.0
# elif __GNUC_PREREQ(3,2)
// If gcc_version >= 3.2
# else
// Else
# endif
#else
// If not gcc
#endif
从那里,您的 makefile 会根据编译器类型、版本等传递适当的编译器标志,然后一切就绪。
【讨论】:
是的,我知道,但这很乏味。【参考方案2】:您可以尝试使用一些#pragma
。见GCC diagnostic pragmas & GCC function specific pragmas。
否则,开发您的 GCC 插件或您的 MELT 扩展并让它提供一个编译指示,在 GCC 中设置适当的变量或编译器状态(实际上是 cc1plus
)
【讨论】:
我查看了#pragma
选项(在询问之前已经),但找不到任何有用的东西。 开发你的 GCC 插件或你的 MELT 扩展我宁愿避免那个 hack。但感谢您指出这种可能性。以上是关于是否可以从 gcc 的源代码中确定或设置编译器选项?的主要内容,如果未能解决你的问题,请参考以下文章
交叉编译:特殊的交叉编译器或只是带有选项 -march 的 gcc?
是否有 GCC 编译器/链接器选项来更改 main 的名称? [复制]