根据 GCC 文档, -MM 标志将以这种方式生成依赖项:
与 -M 类似,但不提及在系统头目录中找到的头文件,也不提及直接或间接包含在此类头中的头文件。
我刚刚发现在我的项目中使用的 -MM 标志不仅抑制了对系统头文件的依赖,而且还抑制了对我本地安装在我的主目录中的第三方库头文件的依赖。摆脱系统头文件的依赖对我来说通常很方便(因为我不编辑它们),但是我有时会编辑/自定义第三方库,当然我需要在这样的编辑后重建我的代码。
所以,我的问题是 GCC 的“系统标头”是什么?假设您在主目录中安装了自定义版本的 libpng,并对其进行了编辑以满足您的需要……这是 GCC 的“系统头文件”吗?
同时,我只是将 -M 作为临时解决方法。
小智 6
在 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
非零意味着system header。在同一个文件中,您还可以找到register_include_chains
哪些处理从特殊环境变量添加到目录中的内容。最后,对于选项解析,add_path
调用 fromgcc/c-family/c-opts.c
以从各种选项添加目录。
归档时间: |
|
查看次数: |
1449 次 |
最近记录: |