从C/C++程序内部访问GCC编译器开关

3

是否可以从程序内部访问使用gcc编译器编译C/C++程序时使用的开关?

在我的应用程序中,作为日志信息的一部分,我希望写下程序使用的编译器开关,例如编译器输入的优化和预处理器变量。

5个回答

6

没有任何标准的方法。

通常是构建系统会生成这样的东西,作为内置于应用程序中的版本字符串(但其中没有任何自动化)。


4
作为对Martin答案的补充:你可以查看Vim源代码作为这种技术的例子 - 在源代码中搜索all_cflagsall_lflags

4

只有一些编译器开关的宏

http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

__OPTIMIZE__ 在所有优化编译中定义。如果编译器进行的是优化大小而不是速度,则定义 __OPTIMIZE_SIZE__。如果没有将函数内联到其调用者中(未进行优化或已通过 -fno-inline 明确禁用内联),则定义 __NO_INLINE__。
如果需要完整的编译字符串,应修改构建/制作脚本以将字符串保存在特殊的 .h 文件中作为常量或定义。

2

另一种解决方案是使用一个 shell 脚本简单地包装 gcc 编译器调用,以将标志保存到头文件中。然后可以在源文件中包含头文件,例如:

#!/bin/sh

echo "#define GCC_OPTIONS \"$*\"" > gcc_options.h
exec gcc $@

如果以gcc_wrap -O0 main.c的方式调用该脚本,将生成包含以下内容的头文件,并继续编译main.c。

#define GCC_OPTIONS "-O0 main.c"

0
在我的一个项目中,每个构建都进入自己的目录,通常整个构建都有一个特定的名称,比如“parallel-debug”或“singlethread-O2”。通常,在该目录中的日志文件会从其位置隐含地给我们所有信息。
无论如何,您可以将$(CC)或$(FLAGS)或其他变量回显到文本文件中,然后让您的程序在启动时读取该文件。这不是元魔法,Scott Meyers可能不会为effective C++ VII面试您,但这个问题似乎不值得那么多的头痛。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接