Directory 如何制作g++;在特定目录中搜索头文件?

Directory 如何制作g++;在特定目录中搜索头文件?,directory,g++,header-files,include-path,Directory,G++,Header Files,Include Path,我有一个项目(一个库),它被细分为几个目录,其中包含代码。我想让g++在项目的根目录中搜索头文件,这样我就可以避免在多个源文件中对相同头文件使用不同的包含路径 主要地,root/目录有子目录A/、B/和C/,它们都有.hpp和.cpp文件。如果A中的某个源文件想要包含B中的file.hpp,它必须这样做:#include../B/file.hpp。对于C中的另一个源文件也是如此。但是,如果A本身有子目录,其中包含需要file.hpp的文件,那么,如果我决定移动文件,它将不一致并且会导致错误(因为

我有一个项目(一个库),它被细分为几个目录,其中包含代码。我想让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++的include路径

A/code.cpp

#include <B/file.hpp>
编辑:

您可以使用环境变量更改g++查找头文件的路径。从手册页:

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

   CPATH
   C_INCLUDE_PATH
   CPLUS_INCLUDE_PATH
   OBJC_INCLUDE_PATH
每个变量的值是一个目录列表,由一个特殊字符分隔,很像PATH,在其中查找头 文件夹。特殊字符“PATH_SEPARATOR”依赖于目标,并在GCC构建时确定。对于基于Microsoft Windows的目标it 是分号,对于几乎所有其他目标,它都是冒号

CPATH指定要搜索的目录列表,就像用-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等中。

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

我看到了你的编辑,你可以在默认位置安装你的标题

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include
不过,请使用编译器文档进行确认

gcc -I/path -L/path
  • -I/path
    要包含的路径,gcc将在此路径中查找.h文件

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

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


例如,g++-B/header_file.h your.cpp-o bin/your_命令

嘿,我已经说明了问题,没有一个重要细节,请查看编辑,谢谢@贝恩,这改变了一切:-)。我编辑了我的答案,加入了更多可以使用的选项。这似乎就是我想要的。我怎样才能准确地编辑这些内容?(使用CLI指令,即我需要将其添加到库的makefile安装规则中。)@Bane,使用指令更新。设置环境变量的确切方式取决于您的环境。但是您提到您正在使用
Makefile
。在这种情况下,为什么不能在
Makefile
中添加
-I/path
标志?为什么要在没有任何选项的情况下执行编译器?因为其他一些项目可能需要库,而我只想移动
lib.a
文件,而不是头文件。我可以将
-I/path
包含到它们的makefiles中,但我不希望这样做。您可以看到上面的install includes位于默认位置以快速解决问题。请注意中的讨论
 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include
gcc -I/path -L/path