如何防止引用的include搜索当前源文件的目录?

Mar*_*ler 17 c gcc include-path

gcc提供了一个-I-选项,在其-I前面的目录-I-中搜索引用的includes(#include "foo.h"),并-I-I-其后面的目录中搜索括号include(#include <foo.h>),以及其他引用的目录包括.

-I-有另一个非常重要的影响.它#include从默认搜索路径中删除所在源文件的目录.通常,带引号的include总是搜索源文件的目录,并任何-I或其他目录之前搜索它. -I-因此,您可以通过删除原则上优先使用的默认路径来指定所需顺序的引用包含文件的确切位置.

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

cc1: note: obsolete option -I- used, please use -iquote instead
Run Code Online (Sandbox Code Playgroud)

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

所以问题是:如何在-I-不使用的情况下获得相同的效果-I-,哪些已被弃用并最终消失?

阐述:

假设文件布局如下:

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

builddir/
    Makefile
    file1.o
    file2.o
    config.h
    libpudding.a
Run Code Online (Sandbox Code Playgroud)

由于各种原因,我们无法config.h从中删除srcdir(它将影响其他平台上的构建过程).但是,我们希望将config.hfrom builddir优先包括在in zconf.hsrcdir.

这可以通过GCC的-I-旗帜完成,但似乎不可能.

更新的问题:

好吧,似乎GNU CC开发人员不赞成使用-I-,但没有提供实现其功能的替代方法.所以我更新的问题是:什么是引起开发人员注意的最有效的方法,这样很可能-I-是未完美的(我觉得最优选,因为这是一种非常优雅的方式来处理指定搜索,比-iquotexxx更加丑陋,或者提供某种方式来从引用的包含搜索路径中删除当前目录?

Rob*_*ier 4

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

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

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

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

  • 只是为此添加一个不同的视图:我有一个情况,我想为单元测试存根特定的头文件,但我不想复制原始源文件。因此,我确实需要从包含搜索路径中删除源文件所在的路径。此外,包含路径始终与顺序相关。如果包含的路径中有两个名称相同的文件,则会出现顺序依赖性。 (2认同)