c - 如何防止引用的包含搜索当前源文件的目录?

标签 c gcc include-path

gcc 提供了 -I-选项,为此 -I -I- 之前的目录搜索引用的包含 ( #include "foo.h" ) 和 -I -I- 之后的目录搜索括号内的包含 ( #include <foo.h> ),以及其他引用的包含。

-I-还有一个非常重要的作用。它删除了 #include 所在的源文件目录。位于默认搜索路径中。通常,引用的包含总是搜索源文件的目录,并在任何-I之前搜索它。或其他目录。 -I-因此,您可以通过删除默认路径来按您想要的顺序准确指定引用包含文件的位置。

所以听起来我回答了我的问题,是吗?不,当我使用 -I-现在,我得到了这个讨厌的图:

cc1: note: obsolete option -I- used, please use -iquote instead

问题是 -iquote 不会从搜索路径中删除当前目录。无论我向 -iquote 提供什么,它仍然总是首先被搜索到.

所以问题是:如何获得与 -I- 相同的效果, 不使用 -I- ,它已被弃用并最终会消失?

阐述:

假设文件布局如下:

srcdir/
    configure
    file1.c
    file2.c
    config.h

builddir/
    Makefile
    file1.o
    file2.o
    config.h
    libpudding.a

由于各种原因,我们无法删除 config.h来自 srcdir (它将影响其他平台上的构建过程)。但是,我们想要包括 config.h来自 builddir优于 zconf.hsrcdir .

这可以通过 GCC 的 -I- 来完成标志,但似乎不可能。

更新的问题:

好吧,GNU CC 开发人员似乎弃用了 -I- ,但没有提供实现其功能的替代方法。所以我更新的问题是:什么是最有效的方法来引起开发人员的注意,以便很有可能 -I-未被弃用(我认为这是最可取的,因为它是处理指定搜索的一种非常优雅的方式,比 -iquotexxx 更丑陋得多),或者提供了某种方式从引用的 include 中删除当前目录搜索路径?

最佳答案

在 out-of-tree 构建中处理过 zconf.h 的烦恼,我肯定会回到你的观点,当一个问题非常棘手时,它通常是错误的问题。你是绝对正确的。正确的问题是为什么 zconf.h 存在于 srcdir 中,而它应该从 zconf.h.in 中生成。对于给定的一组配置设置,文件应该总是生成或永远不会生成。它永远不应在同一构建中同时提供和生成。

这里最好的解决方案是从源代码树中删除 zconf.h 并始终从 zconf.h.in 生成它,就像在 CMake 构建中所做的那样。我一直不清楚为什么它以一种方式为 CMake 而另一种方式为 Make。如果要点是你没有 autoconf,所以你要使用预构建的 zconf.h 用于 CMake,但是 CMake 为 CMake 生成的,那么只需发送它作为 zconf.h.in(你这样做),并将其复制到 Makefile 中的构建树中。

摆脱 -I- 的奇怪行为是一个很好的举措。在你的搜索路径中有多个文件被同名引用是非常困惑和丑陋的。如果 -I 搜索顺序很重要,那么您的项目或构建中的某些内容设计不正确。我永远不必猜测 #include "foo.h" 指的是什么。我绝对不应该处于很容易发现自己编辑错误文件的情况。

我赞赏您改进 zlib 构建的工作。 zlib 当然不是最难构建的包,但它肯定也不是最简单的(特别是如果你需要 contrib/minizip 的东西,我总是这样做)。

关于c - 如何防止引用的包含搜索当前源文件的目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11605515/

相关文章:

c - 使用 C 进行插入排序的指针表示法

c - 在 Linux 上从 #include 生成 GCC 选项

c - 为什么在数组界限之外访问索引时,我的代码为什么不分段?

php - PHP-无法打开流:没有这样的文件或目录

git-submodules - 柳絮/ROS : How-to specify include path correctly when using submodules

c - 为什么我的 C 程序中的浮点值会发生变化?

ios - 获取创建套接字的进程的 pid

python - 如何为 Alpine 编译 python?

c++ - Qt 创建者:c++:未定义对 Class::Function 的引用

c - 我的链表未填充 C