我有一个项目(一个库),它被细分为几个目录,其中包含代码。我想在项目的根目录中搜索头文件,因此我可以避免跨多个源文件的相同头文件的不同包含路径。
主要是,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 ++的包含路径!
答案 0 :(得分:44)
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相同。 -I /专用/包括
您可以通过多种方式更改环境变量。在bash提示符下,您可以执行以下操作:
$ export CPATH=/your/source/root
$ g++ /your/source/root/A/code.cpp
$ g++ /your/source/root/A/a/code2.cpp
您当然可以在Makefile等中添加它。
答案 1 :(得分:16)
gcc -I/path -L/path
-I /path
要包含的路径,gcc会在此路径中找到.h文件
-L /path
包含库文件,.a
,.s
o
答案 2 :(得分:0)
#include&lt;&gt;附带的标头将在所有默认目录中搜索,但您也可以使用-I命令行arg在搜索路径中添加自己的位置。
我看到您的编辑,您可以在默认位置安装标题
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
尽管使用编译器文档确认。
答案 3 :(得分:0)
很简单,使用“-B”选项将.h文件的目录添加到搜索路径。
E.g。 g ++ -B /header_file.h your.cpp -o bin / your_command