2011-01-09 36 views
3

可以从程序内部访问编译了c/C++程序的gcc编译器开关吗?从内部C/C++程序访问GCC编译器开关

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

回答

6

不以任何标准方式。

它通常是构建系统,它将在构建到应用程序中的版本字符串中生成这样的内容(但它们都不是自动的)。

4

作为Martin答案的补充:作为这种技术的一个例子,您可以看看Vim的源代码 - grep代码为all_cflagsall_lflags

4

用于编译器开关

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

 
__OPTIMIZE__ 
__OPTIMIZE_SIZE__ 
__NO_INLINE__ 

__OPTIMIZE__在所有优化编译定义只有一些宏。如果编译器正在优化大小而不是速度,则定义__OPTIMIZE_SIZE____NO_INLINE__被定义,如果没有函数将被内联到他们的调用者(当没有优化时,或者内联已被-fno-inline特别禁用时)。

如果你需要一个完整的编译字符串,您应该修改您的构建/制作脚本保存在字符串中的特殊.h文件作为常量或定义。

0

在我的一个项目中,每个构建都进入了自己的目录,通常整个构建都有一个特定的名称,如“parallel-debug”或“singlethread-O2”。通常,该目录中的一个日志文件将它的位置隐含给我们所有的信息。

无论如何,你可以做的是将$(CC)或$(FLAGS)或任何变量回显到文本文件中,然后让程序在启动时读取该文件。它不是元魔法,Scott Meyers可能没有采访你,因为它有效的C++ VII,但是这个问题似乎并不值得那么多头疼。

2

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

#!/bin/sh 

echo "#define GCC_OPTIONS \"$*\"" > gcc_options.h 
exec gcc [email protected] 

调用该脚本gcc_wrap -O0 main.c将产生头文件包含以下内容,然后用main.c中的编制进行

#define GCC_OPTIONS "-O0 main.c"