g++ 不会从它存在的第一个包含路径中获取头文件吗?

Posted

技术标签:

【中文标题】g++ 不会从它存在的第一个包含路径中获取头文件吗?【英文标题】:Does g++ not take header files from the first include path it exists in? 【发布时间】:2017-03-11 18:58:23 【问题描述】:

我正在尝试构建一个third party tool。我对 C++ 构建工具不是很熟悉,也不知道该如何解决。

dcp2icc.src/dcp2icc.cpp 第 6 行是:

#include "dng_camera_profile.h"

dng_sdk_1_2/dng_sdk/source/dng_camera_profile.h 第 39 行:

#include "dng_hue_sat_map.h"

两个dng_hue_sat_map.h文件:

$ ls -l dng_sdk_1_2/dng_sdk/source/dng_hue_sat_map.h fixes/dng_sdk/dng_hue_sat_map.h
-r--r--r-- 1 user users 3141 Apr  9  2008 dng_sdk_1_2/dng_sdk/source/dng_hue_sat_map.h
-rw-r--r-- 1 user users 3124 Oct 31  2015 fixes/dng_sdk/dng_hue_sat_map.h

最后,这是运行的命令:

g++ -o build/dcp2icc/dcp2icc.o -c -m32 -O2 -iquote- -DUNIX_ENV=1 -D_FILE_OFFSET_BITS=64 -DkBigEndianHost=0 -Idcp2icc.src -Ifixes/dng_sdk -Idng_sdk_1_2/dng_sdk/source -INone dcp2icc.src/dcp2icc.cpp

我预计因为-Ifixes/dng_sdk 出现在-Idng_sdk_1_2/dng_sdk/source 之前,所以会使用fixes/dng_sdk/dng_hue_sat_map.h,但事实并非如此:

In file included from dng_sdk_1_2/dng_sdk/source/dng_camera_profile.h:39:0,
                 from dcp2icc.src/dcp2icc.cpp:6:
dng_sdk_1_2/dng_sdk/source/dng_hue_sat_map.h:129:8: error: extra qualification 'dng_hue_sat_map::' on member 'operator==' [-fpermissive]
   bool dng_hue_sat_map::operator== (const dng_hue_sat_map &rhs) const;
        ^~~~~~~~~~~~~~~

当头文件存在于两个包含位置时,g++如何选择使用哪个文件? includes 在哪个序列中是否重要,如果是,如何?

man g++ 只想说:

-我的目录

将目录 dir 添加到要搜索头文件的目录列表中。在标准系统包含目录之前搜索由 -I 命名的目录。如果目录 dir 是标准的系统包含目录,则忽略该选项以确保系统目录的默认搜索顺序和系统标头的特殊处理不会被破坏。如果 dir 以“=”开头,则“=”将替换为 sysroot 前缀;请参阅 --sysroot 和 -isysroot。

GCC spec 说以下内容,据我所知,这与我所看到的相反:

您可以在命令行中指定多个 -I 选项,在这种情况下,将按从左到右的顺序搜索目录。

【问题讨论】:

这是 GCC 的规范,根据我的经验,会发生什么。您一定还有其他问题。 【参考方案1】:

您使用的是#include "..." 表单,而不是#include <...> 表单。

文件dng_sdk_1_2/dng_sdk/source/dng_camera_profile.h 包括"dng_hue_sat_map.h"#include "..." 首先搜索相对于执行包含的文件,因此它首先在 dng_sdk_1_2/dng_sdk/source 中搜索,而不考虑 -I 选项。

【讨论】:

啊。由于我无法更改原始代码,建议的修复方法是什么?用替换文件覆盖就行了? @l0b0 我认为我的方法是将dng_camera_profile.h 的副本放在fixes/dng_sdk 目录(或符号链接)中。这将使#include "dng_camera_profile.h" 选择那个版本,而后者又会从那里选择"dng_hue_sat_map.h"

以上是关于g++ 不会从它存在的第一个包含路径中获取头文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在sqlite数据库中获取树并将节点转换为从它到根的路径?

如何判断头文件包含在哪里?

你可以从它的路径访问一个选择的 StorageFile 吗? - UWP

如何让g ++搜索特定目录中的头文件?

如何让g ++搜索特定目录中的头文件?

更新linux中的包含路径