gcc提供-I-
选项,为-I
之前的-I-
目录搜索引用的包含(#include "foo.h"
)和-I
目录我会搜索-I-
括号内的{({1}}),以及其他引用包含的内容。
#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.h
。
这可以通过GCC的srcdir
标志来完成,但似乎不可能。
更新了问题:
好吧,似乎GNU CC开发人员弃用-I-
,但没有提供实现其功能的替代方法。所以我更新的问题是:什么是引起开发人员注意的最有效的方法,以便很有可能-I-
未被提及(我认为最优先,因为它是一个相当的处理指定搜索的优雅方式,比-iquotexxx更加难以理解,或者提供某种方式从引用的包含搜索路径中删除当前目录?
答案 0 :(得分:4)
在一个树外构建中遇到了zconf.h
的烦恼,我肯定会回到你的观点,当一个问题非常棘手时,通常是错误的问题。你是绝对正确的。正确的问题是zconf.h
中存在srcdir
的原因,它应该来自zconf.h.in
。对于给定的一组配置设置,应始终生成或永远不生成文件。它永远不应该在同一个版本中提供和生成。
此处的最佳解决方案是从源树中删除zconf.h
并始终从zconf.h.in
生成它,就像在CMake构建中一样。我从来都不清楚为什么它为CMake和Make做了另一种方式。如果关键是你没有autoconf,那么你将使用预先构建的zconf.h
进行make,而使用CMake生成的进行CMake,然后将其作为{{1}运送(你这样做),并将其复制到Makefile中的构建树中。
摆脱zconf.h.in
的离奇行为是一个很好的举措。在您的搜索路径中有多个文件使用相同的名称引用是非常混乱和丑陋的。如果-I-
搜索顺序很重要,那么您的项目或构建中的某些内容设计不正确。我永远不应该猜到-I
指的是什么。我绝对不会遇到很容易发现自己编辑错误文件的情况。
我赞赏你改进zlib构建的工作。 zlib肯定不是最难构建的软件包,但它肯定不是最简单的(特别是如果你需要contrib / minizip的东西,我总是这样做。)