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

时间:2017-03-11 18:58:24

标签: c++ g++

我正在尝试构建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 ++如何选择使用哪个文件? include s在哪个序列中是否重要,如果是,如何?

man g++只是这样说:

  

-I dir

     

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

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

  

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

1 个答案:

答案 0 :(得分:2)

您使用的是#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进行搜索。