gpt4 book ai didi

gcc - GCC -MM 标志的 "system headers"的确切含义

转载 作者:行者123 更新时间:2023-12-03 02:26:20 29 4
gpt4 key购买 nike

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

Like -M but do not mention header files that are found in system header directories, nor header files that are included, directly or indirectly, from such a header.

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

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

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

最佳答案

系统头目录

在 GCC 中,系统头目录就是这样;系统头目录。确定什么是系统头目录、什么不是系统头目录并没有什么魔力。 GCC 将您指定为系统头目录的目录视为系统头目录。

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

哪些目录成为系统头目录?

使用命令行选项 -iwithprefix-isystem-idirafter 添加的目录被视为系统头目录。所有这三个选项的文档都清楚表明它们得到与实际系统 header 相同的特殊待遇。此外,环境变量 C_INCLUDE_PATHCPLUS_INCLUDE_PATHOBJC_INCLUDE_PATH 中的路径被视为使用 -isystem 选项传递,因此也被视为系统 header 。

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

哪些目录没有?

使用 -iquote-iwithprefixbefore-I 添加的目录不会被视为系统头目录。这还包括 CPATH 环境变量中的目录,该目录被视为使用 -I 选项传递。

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

由于我花了一些时间搜索 GCC 源代码来查找其定义方式,因此我将为感兴趣的人留下此注释:什么是系统头、什么不是系统头的精确定义可以在 add_path 中看到gcc/incfile.c 中的函数。这里,sysp 非零意味着系统 header 。在同一个文件中,您还可以找到 register_include_chains,它处理从特殊环境变量添加目录的操作。最后,对于选项解析,从 add_path 调用 gcc/c-family/c-opts.c 以添加各种选项的目录。

关于gcc - GCC -MM 标志的 "system headers"的确切含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35607593/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com