gcc:传递预处理器定义的列表

gcc:传递预处理器定义的列表,gcc,c-preprocessor,Gcc,C Preprocessor,我有一个相当长的预处理器定义列表,我想让使用gcc编译的几个C程序可以使用这些定义 基本上,我可以创建一个巨大的-DDEF1=1-DDEF2=2的列表。。。传递给gcc的选项会造成巨大的混乱,很难在版本控制系统中使用,并且在将来的某个时候可能会突破命令行长度限制 我想在文件中定义我的定义 基本上,-imacros可以做我想做的事情,除了它只将它传递到第一个源文件:(下面来自gcc文档): -include file处理文件,就像#include“file”显示为主源文件的第一行一样。但是,搜索的

我有一个相当长的预处理器定义列表,我想让使用gcc编译的几个C程序可以使用这些定义

基本上,我可以创建一个巨大的-DDEF1=1-DDEF2=2的列表。。。传递给gcc的选项会造成巨大的混乱,很难在版本控制系统中使用,并且在将来的某个时候可能会突破命令行长度限制

我想在文件中定义我的定义

基本上,-imacros可以做我想做的事情,除了它只将它传递到第一个源文件:(下面来自gcc文档):

-include file处理文件,就像#include“file”显示为主源文件的第一行一样。但是,搜索的第一个目录 for file是预处理器的工作目录,而不是 包含主源文件的目录。如果在那里找不到,它就是 在#include“…”搜索链的其余部分中搜索 正常。如果提供了多个包含选项,则会包含这些文件 按它们在命令行上的显示顺序排列

-imacros文件与-include完全相同,只是扫描文件产生的任何输出都会被丢弃。它定义的宏保持定义状态。 这允许您从标头中获取所有宏,而无需 处理其声明。由-imacros指定的所有文件都是 在-include指定的所有文件之前处理

我需要在所有源文件中提供定义,而不仅仅是第一个源文件。

请查看本文档的底部


您可能需要的是
@file
选项。此选项告诉GCC使用
文件
作为命令行选项。这个文件当然可以包含预处理器定义。

老实说,听起来您需要在构建环境中做更多的工作

例如,一个建议是,听起来您应该创建一个包含在所有源文件中的头文件,并定义所有定义

您还可以使用
-include
,但指定一个显式路径,该路径应在Makefile/build环境中确定


如果Makefile独立地将每个源文件构建到自己的对象文件中(这是典型的),那么-imacros就可以工作。听起来你只是把所有的源代码都投入到构建一个对象中。

你是否验证了你确实正确地阅读了文档?在我的理解中,“主源文件”并不一定意味着它将只处理第一个源文件或仅处理单个文件,而是作者只想区分源文件和您使用
-include
-imacros
加载的文件。很可能作者只是假设“简单”的情况下,只有一个源文件,所以他不想使措辞过于复杂和含糊不清。我只是想尝试一下,如果它能工作的话,很可能会。我只是尝试了一下,它确实工作得很好(使用GCCMingW4.7.1)。编译两个文件,两个文件都使用宏,并仅通过
-imacros
将其包括在内。