如何让g ++搜索特定目录中的头文件?
Posted
技术标签:
【中文标题】如何让g ++搜索特定目录中的头文件?【英文标题】:How to make g++ search for header files in a specific directory? 【发布时间】:2012-09-29 15:29:56 【问题描述】:我有一个项目(一个库),它被细分为几个目录,其中包含代码。我想让 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++ 设置包含路径!
【问题讨论】:
注意What are the benefits of a relative path such as#include "../include/header.h"
for a header?中的讨论
【参考方案1】:
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 等中。
【讨论】:
嘿,我已经提出了一个没有重要细节的问题,请查看编辑,谢谢! @Bane,这改变了一切:-)。我编辑了我的答案以包含更多可以使用的选项。 这似乎是我正在寻找的。我该如何编辑这些? (使用 CLI 指令,也就是说,我需要将其添加到我的库的 makefile 的安装规则中。) @Bane,已更新说明。设置环境变量的确切方法取决于您的环境。但你提到你正在使用Makefile
。在这种情况下,为什么不能在Makefile
中添加-I /path
标志?为什么要在没有任何选项的情况下执行编译器?
因为其他一些项目可能需要这个库,我只想移动 lib.a
文件,而不是头文件。我可以将-I /path
包含到他们的 makefile 中,但我不想这样做。【参考方案2】:
gcc -I/path -L/path
-I /path
要包含的路径,gcc会在这个路径中找到.h文件
-L /path
包含库文件,.a
,.s
o
【讨论】:
【参考方案3】:很简单,使用“-B”选项将 .h 文件的目录添加到搜索路径。
例如g++ -B /header_file.h your.cpp -o bin/your_command
【讨论】:
【参考方案4】:#include 中包含的标头将在所有默认目录中搜索,但您也可以使用 -I 命令行参数在搜索路径中添加自己的位置。
我看到了您的编辑,您通常可以将标题安装在默认位置
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
确认编译器文档。
【讨论】:
你看上面安装包括在默认位置快速解决。以上是关于如何让g ++搜索特定目录中的头文件?的主要内容,如果未能解决你的问题,请参考以下文章