【发布时间】:2012-07-21 06:35:34
【问题描述】:
gcc 提供了-I- 选项,在-I- 之前的-I 目录中搜索带引号的包含(#include "foo.h"),在-I- 之后的-I 目录中搜索带括号的包含(@ 987654329@),以及其他引用的包括。
-I- 还有一个非常重要的作用。它会从默认搜索路径中删除#include 所在的源文件目录。通常,带引号的包含总是搜索源文件的目录,并在任何-I 或其他目录之前搜索它。因此,-I- 允许您通过删除默认路径(否则会优先考虑)来准确指定引用包含文件的位置。
所以听起来我回答了我的问题,是吗?不,当我现在使用-I- 时,我得到了这个讨厌的图:
cc1: note: obsolete option -I- used, please use -iquote instead
问题在于-iquote 确实没有从搜索路径中删除当前目录。无论我向-iquote 提供什么,它仍然总是首先搜索。
所以问题是:如何在不使用 -I- 的情况下获得与 -I- 相同的效果,而 -I- 已被弃用并最终会消失?
阐述:
假设文件的布局如下:
srcdir/
configure
file1.c
file2.c
config.h
builddir/
Makefile
file1.o
file2.o
config.h
libpudding.a
由于各种原因,我们无法从srcdir 中删除config.h(这会影响其他平台上的构建过程)。但是,我们希望包含来自builddir 的config.h,而不是srcdir 中的zconf.h。
这可以通过 GCC 的 -I- 标志来完成,但似乎不可能。
更新问题:
好吧,看来 GNU CC 开发人员已弃用 -I-,但没有提供实现其功能的替代方法。所以我更新的问题是:让开发人员注意这一点的最有效方法是什么,以便-I- 很可能不被弃用(我认为这是最可取的,因为它是一种非常优雅的方式处理指定搜索,比 -iquotexxx 更丑更丑),或者提供某种方法从引用的包含搜索路径中删除当前目录?
【问题讨论】:
-
快速浏览 GCC 手册让我相信这是不可能的,
-I-是该行为的唯一选择。过去,我决定对我自己的项目最简单的选择是重命名或重新组织我的头文件,而不是使用搜索路径。来源:gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/… -
这是针对用户要求的 zlib 的源目录外构建。这与我想如何为自己整理东西没有任何关系。
-
嗯,过去我确保我的项目支持树外构建,但我从来不需要使用
-I-来完成它。这是你正在寻找的那种改变吗? github.com/depp/zlib -
这很复杂。 (这里的自然趋势似乎是,如果这个问题很难回答,那么它一定是错误的问题。)无论如何,zconf.h是构建的,需要在builddir中,并被zlib.h引用,即在 srcdir 中。源文件包括引用的 zlib.h。因此,无论 zlib.h 只是在 srcdir 中还是复制到 builddir,都存在包含正确 zlib.h 的源文件或包含正确 zconf.h 的 zlib.h 的问题。由于其他原因,我无法更改引用包含的事实。
-
好吧,您也可以将所有源文件符号链接到 builddir。也许这只是阻力最小的路径。
标签: c gcc include-path