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

58

我有一个项目(一个库),分成几个目录,目录中都有代码。我希望g++能够在项目的根目录中搜索头文件,这样我就可以避免在多个源文件中为相同的头文件使用不同的包含路径。

主要是,root/目录下有子目录A/B/C/,它们都有.hpp.cpp文件。如果A中的某个源文件想要包含B中的file.hpp,它必须这样做:#include "../B/file.hpp"。C中的另一个源文件也是如此。但是,如果A本身有子目录,其中的文件需要file.hpp,那么它将是不一致的,如果我决定移动文件,将会导致错误(因为包含路径将是"../../B/file.hpp")。

此外,这也需要在其他项目中工作,这些项目不在root/之内。我已经知道手动将所有头文件复制到默认搜索目录的选项,但我想以我描述的方式做。

编辑:所有使用该库的程序必须仅使用g++ prog.cpp lib.a -o prog进行编译。这意味着必须永久性地设置g++的包含路径!


4个回答

68

A/code.cpp

#include <B/file.hpp>

这是一个文件路径,其中A代表根目录,a代表子目录,code2.cpp则是文件名。

#include <B/file.hpp>

使用以下命令进行编译:

g++ -I /your/source/root /your/source/root/A/code.cpp
g++ -I /your/source/root /your/source/root/A/a/code2.cpp

编辑:

您可以使用环境变量更改g++用于查找头文件的路径。来自man页面的说明:

一些附加的环境变量会影响预处理器的行为。

   CPATH
   C_INCLUDE_PATH
   CPLUS_INCLUDE_PATH
   OBJC_INCLUDE_PATH
每个变量的值都是由一个特殊字符分隔的目录列表,类似于 PATH,用于查找头文件。特殊字符“PATH_SEPARATOR”取决于目标平台,并在 GCC 构建时确定。对于基于 Microsoft Windows 的目标平台,它是分号;对于几乎所有其他目标平台,它是冒号。
CPATH 指定要搜索的目录列表,就好像使用 -I 指定一样,但是在命令行中给出 -I 选项后。无论正在预处理哪种语言,此环境变量都会被使用。
其余的环境变量仅适用于预处理指定的语言。每个变量指定了一个目录列表,就好像使用 -isystem 指定一样,但是在命令行中给出 -isystem 选项后。
在所有这些变量中,空元素指示编译器搜索其当前工作目录。空元素可以出现在路径的开头或结尾。例如,如果 CPATH 的值为“:/special/include”,那么它的效果与 -I /special/include 相同。
有许多方法可以更改环境变量。在 bash 提示符上,您可以这样做:
$ export CPATH=/your/source/root
$ g++ /your/source/root/A/code.cpp
$ g++ /your/source/root/A/a/code2.cpp

当然,您可以将此添加到您的Makefile等文件中。


嘿,我在没有重要细节的情况下提出了问题,请查看编辑,谢谢! - corazza
@Bane,这改变了一切 :-)。我编辑了我的答案,包括更多可用的选项。 - Vikas
1
那似乎是我正在寻找的东西。我该如何编辑它们呢?(使用CLI指令,也就是我需要添加到库的makefile的安装规则中。) - corazza
@Bane,已更新说明。设置环境变量的确切方式将取决于您的环境。但是您提到您正在使用 Makefile。在这种情况下,为什么不能在您的 Makefile 中添加 -I /path 标志呢?为什么要让编译器在没有任何选项的情况下执行呢? - Vikas
因为其他一些项目可能需要这个库,而我只想移动 lib.a 文件,而不是头文件。我可以在 它们的 makefile 中包含 -I /path,但我宁愿不这样做。 - corazza

36
gcc -I/path -L/path
  • -I /path 是指定头文件路径,gcc 会在该路径下查找 .h 文件

  • -L /path 是指定库文件路径,包含 .a.so 文件


1

很简单,使用“-B”选项将.h文件的目录添加到搜索路径中。

例如:g++ -B /header_file.h your.cpp -o bin/your_command


0

#include <>所包含的头文件将在所有默认目录中搜索,但您也可以使用-I命令行参数将自己的位置添加到搜索路径中。

我看到了你的编辑,通常你可以将你的头文件安装在默认位置。

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

不过请确认一下编译器文档。


请参见上面的安装说明,以获取默认位置的安装文件,以便快速解决问题。 - NiladriBose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接