是否可以直接从C源代码传递GCC参数?

时间:2018-11-18 13:54:32

标签: c gcc arguments c-preprocessor

我希望能够从我的GCC源代码向C传递参数,就像这样……

// pass the "-ggdb" argument to GCC (I know this won't work!)
#define GCC_DEBUG_ARG -ggdb
int main(void) {
    return 0;
}

使用此代码,我想简单地运行gcc myfile.c,它将真正运行gcc myfile.c -ggdb(因为已经从C源代码中提取了“ -ggdb”参数)。

我对将make与环境变量CFLAGS一起使用不感兴趣,我只是想知道是否有可能在C源代码中嵌入GCC选项

1 个答案:

答案 0 :(得分:3)

您通常无法做的事。

但是,最近的GCC(例如,2018年底的GCC 8)接受many options,其中的 some 可以通过function attributes或{{3 }}(但是,他们不接受-g,但接受-O2)。

此外,您可以在每个编译中使用-g(对于GCC,它可以与诸如-O2之类的优化标志混合使用;因此运行时性能不会受到影响。当然-g会增加编译时间和产生的目标文件的大小)。注意(在Linux上)function specific pragmas调试信息在生成的汇编文件中可见(例如,尝试用foo.c编译gcc -Wall -g -O -S -fverbose-asm foo.c,查看生成的foo.s,然后删除-g

  

我只想运行gcc myfile.c

这是一个非常不好的习惯。您应该运行gcc -Wall -Wextra -g myfile.c -o myprog来获取所有警告(您确实需要它们)并在DWARF myprog中调试信息。在继续编写程序之前,请先阅读executable

  

我对将CFLAGS环境变量与make结合使用不感兴趣

但是您确实应该 How to debug small programs 或其他一些Using make工具(例如build automationninjaomake等),等。) ,实际上是 使用GCC的常规方法

或者,在Linux上,编写一个很小的rake进行编译(如果您的程序是单个源文件,这尤其值得;对于更大的程序,您确实应该使用一些内部版本自动化工具)。最后,如果您将shell script用作emacs,则可以添加几行注释(例如在source code editor示例中),指定end of my manydl.c来调整{{3} }(由emacs完成)

如果这些约定使您感到惊讶,请阅读Emacs file variables,然后为启发而学习一些现有compilation的源代码(例如在Unix philosophyfree software或在您最喜欢的Linux发行版中)。

最后, github本身是一个免费软件项目(但是,在超过500万行的大多数C ++源代码中,这是一个巨大的数目)。因此,在以某种方式学习了源代码之后,您可以按照自己想要的方式改进(如果您遵循其gitlab许可)。这将需要您花费数月(或数年)的时间(因为要理解GCC非常复杂)。

另请参阅GCC,以解决相关问题。

您也可以(但我建议不要这样做,因为这很令人困惑)与您的GPLv3+一起玩弄技巧,并在其中有一些目录- $HOME/bin/,在包含/usr/bin/的{​​{1}}之前,并且您的shell脚本名为/usr/bin/gcc;但不要那样做,您会感到困惑。而是编写一些“通用” gcc this answer,它将运行mygcc并向其添加适当的标志(我认为这样做不值得)。