根据GCC文档,-MM标志将以这种方式生成依赖项:
与-M类似,但不提及在系统中找到的头文件 头文件目录,或直接或包含的头文件 间接地,来自这样的标题。
我刚刚发现在我的项目中使用-MM标志不仅抑制了对系统头的依赖性,而且还依赖于我在本地目录中本地安装的第三方库头。摆脱系统头依赖关系对我来说通常很方便(因为我不编辑它们),但是我有时编辑/自定义第三方库,当然我需要在编辑后重建我的代码。
所以,我的问题是GCC的“系统头”是什么?假设您在主目录中安装了自定义版本的libpng,并根据您的需要进行编辑...是GCC的“系统头”吗?
我现在只是转向-M作为临时解决方法。
答案 0 :(得分:4)
在GCC中,系统头文件就是这样;系统头目录。确定什么是系统头目录和什么不是系统头目录没有任何魔力。 GCC将您告诉它的目录视为系统头目录。
如果您在主目录中安装第三方库的标头(如您的示例),然后继续编译需要此库与GCC的项目,您的编译将因为缺少所述库而失败,或者它将使用系统安装的库版本。这是因为您没有指定您告诉GCC包含此本地安装,GCC不会神奇地为您执行此操作。当您指定在搜索标题时要包括的目录时,您还告诉GCC是否将这些目录视为系统标题目录。
使用命令行选项-iwithprefix
,-isystem
和-idirafter
添加的目录被视为系统头目录。所有这三个选项的文档都很清楚,它们与实际系统头文件具有相同的特殊处理。此外,环境变量C_INCLUDE_PATH
,CPLUS_INCLUDE_PATH
和OBJC_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
以从各种选项添加目录。