GCC -MM标志的“系统头”的确切含义

时间:2016-02-24 16:26:44

标签: gcc dependencies

根据GCC文档,-MM标志将以这种方式生成依赖项:

  

与-M类似,但不提及在系统中找到的头文件   头文件目录,或直接或包含的头文件   间接地,来自这样的标题。

我刚刚发现在我的项目中使用-MM标志不仅抑制了对系统头的依赖性,而且还依赖于我在本地目录中本地安装的第三方库头。摆脱系统头依赖关系对我来说通常很方便(因为我不编辑它们),但是我有时编辑/自定义第三方库,当然我需要在编辑后重建我的代码。

所以,我的问题是GCC的“系统头”是什么?假设您在主目录中安装了自定义版本的libpng,并根据您的需要进行编辑...是GCC的“系统头”吗?

我现在只是转向-M作为临时解决方法。

1 个答案:

答案 0 :(得分:4)

系统头目录

在GCC中,系统头文件就是这样;系统头目录。确定什么是系统头目录和什么不是系统头目录没有任何魔力。 GCC将您告诉它的目录视为系统头目录。

如果您在主目录中安装第三方库的标头(如您的示例),然后继续编译需要此库与GCC的项目,您的编译将因为缺少所述库而失败,或者它将使用系统安装的库版本。这是因为您没有指定您告诉GCC包含此本地安装,GCC不会神奇地为您执行此操作。当您指定在搜索标题时要包括的目录时,您还告诉GCC是否将这些目录视为系统标题目录。

哪些目录成为系统标题?

使用命令行选项-iwithprefix-isystem-idirafter添加的目录被视为系统头目录。所有这三个选项的文档都很清楚,它们与实际系统头文件具有相同的特殊处理。此外,环境变量C_INCLUDE_PATHCPLUS_INCLUDE_PATHOBJC_INCLUDE_PATH中的路径被视为与-isystem选项一起传递,因此也被视为系统标头。

显然,不言而喻,实际的系统头文件,例如编译器附带的或系统安装的系统头文件也被视为系统头文件。

哪个目录没有?

添加了-iquote-iwithprefixbefore-I的目录不会被视为系统标头目录。这还包括来自CPATH环境变量的目录,该变量被视为通过-I选项传递。

执行此操作的源代码在哪里?

由于我花了一些时间搜索GCC源代码以找出它是如何定义的,所以我会留下这个注释给任何感兴趣的人:可以看到什么是什么和什么不是系统头的精确定义add_path中的gcc/incfile.c函数。此处,sysp为非零表示系统标题。在同一个文件中,您还可以找到register_include_chains,它处理从特殊环境变量中添加目录。最后,对于选项解析,从add_path调用gcc/c-family/c-opts.c以从各种选项添加目录。