53

我有一个项目(一个库),它被细分为几个目录,其中包含代码。我想让 g++ 在项目的根目录中搜索头文件,这样我可以避免跨多个源文件的相同头文件的不同包含路径。

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

此外,这也需要在其他项目中工作,这些项​​目位于root/. 我已经知道有一个选项可以手动将我的所有头文件复制到默认搜索目录中,但我想按照我描述的方式进行操作。

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

4

4 回答 4

64

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++ 查找头文件的路径。从手册页:

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

   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 具有相同的效果。-我/特别/包括。

您可以通过多种方式更改环境变量。在 bash 提示符下,您可以执行以下操作:

$ export CPATH=/your/source/root
$ g++ /your/source/root/A/code.cpp
$ g++ /your/source/root/A/a/code2.cpp

您当然可以将其添加到您的 Makefile 等中。

于 2012-09-29T15:35:57.783 回答
28
gcc -I/path -L/path
  • -I /path要包含的路径,gcc 会在这个路径中找到 .h 文件

  • -L /path包含库文件, .a, .so

于 2012-09-29T15:49:58.153 回答
1

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

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

于 2014-04-23T23:50:33.773 回答
0

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

我看到了您的编辑,您通常可以将标题安装在默认位置

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

不过,请确认编译器文档。

于 2012-09-29T15:38:35.990 回答