我正在使用其他人编写的库,该库有点基于C进行C++使用-我认为-。标头或源文件中使用的所有包含项都采用 <> 而不是 " 的形式,即使它们不是标准库文件。我的编译器无法识别它们并返回错误"找不到文件">
问题的一个示例位于以下标头中:
#ifndef _ga_ga_h_
#define _ga_ga_h_
// Make sure that we get the configuration into each of the galib components
// that will be used.
#include <ga/gaconfig.h>
// These are the headers for all of the genetic algorithm classes.
#include <ga/GASimpleGA.h>
#include <ga/GASStateGA.h>
#include <ga/GAIncGA.h>
#include <ga/GADemeGA.h>
#include <ga/GADCrowdingGA.h>
// Here we include the headers for all of the various genome types.
#include <ga/GA1DBinStrGenome.h>
#include <ga/GA2DBinStrGenome.h>
#include <ga/GA3DBinStrGenome.h>
#include <ga/GABin2DecGenome.h>
我使用"ga.h"将该标头包含在我的程序中 #include 但是很难在库中的每个标头/源文件中进行更改。
有没有办法让编译器像"一样使用<>? 我尝试将路径添加到"添加包含目录"从项目属性(我使用的是 Visual Studio),许多包含的错误消失了,但大约 30 个仍然存在。奇怪的是它们在一个名为"c1xx"的文件中,但我没有那个文件!!
谢谢
定义有点像<>用于"系统"头文件,通常位于/usr/include 等位置(在类 Unix 系统上),而 " 用于本地头文件。 编译代码时,您可以指示包含头文件的其他目录的位置,例如在使用 GCC 时使用 -I 选项。 查看编译器的文档以了解所需的设置
因此,例如在 Linux 和 GCC 上,如果你的 "ga" 目录在/usr/local/include/ga,你可以使用 cc -I/usr/local/include。
这看起来确实像是告诉编译器在哪里查找包含的头文件的问题。如其他答案中所述,当您执行#include <header.h>
时,header.h 必须位于包含搜索路径之一中 - 系统包含或您告诉编译器查找标头的其他路径。在 Linux/g++ 中(如此处的其他答案所述),您可以通过在-I
标志中传入其他搜索路径来实现这一点。编译命令如下所示:
g++ -I/additional/header/search/path -o a.out your_file.cpp
由于您使用的是 Visual Studio 和 MSVC 编译器,因此等效项将是/I
标志,编译命令如下所示:
CL /Iadditionalheaderpath your_file.cpp
我假设您使用的是Visual Studio - 您也可以从项目属性中对其进行配置。转到Configuration Properties > C/C++ > General
并修改Additional Include Directories
。有关详细信息,请参阅以下内容:
设置C++编译器和生成属性
其他包含目录
首先关于<header>
和<file>
之间的区别。标准(C 和 C++)仅指定
#include <header>
包括一个名为header的标头,并且
#include "file"
包括名为file的源文件,如果未找到,则包含名为File的标头。
什么是标头以及它们与源文件有何不同留给实现。实际上,它们也是文件。所以#include <header>
在某些地方寻找文件,#include "file"
正在其他地方寻找文件,如果在与#include <file>
相同的位置找不到文件。
AFAIK 所有编译器
能够在包含 include 指令的文件目录中搜索源文件
能够在默认搜索路径之前获得目录列表以搜索标头。
ISTR表示,Visual C++也在间接包含源文件的文件目录中搜索源文件。(我目前无法确认我的记忆是否良好;这种行为是其他编译器无法实现的,所以我从未依赖过它,而且 - 幸运的是?- 它从未导致我的程序出现不同的行为)。
显然,这种行为或多或少是可定制的。例如,使用 g++ 可以:
禁用在包含 include 指令的文件目录中搜索源文件(使用
-I-
,请注意,自 GCC 4.0 -- 2005 年以来,-I-
已被弃用 - 当引入了-iquote
并且没有不推荐使用的方法来实现这一点时)添加目录列表以搜索源文件而不是标头(使用
-iquote
,这也是-I-
的效果)在默认目录列表(带
-idirafter
)之后给出目录列表以搜索标头给出目录列表以搜索专门处理的标头(使用
-isystem
;对于那些文件中的构造给出的警告较少,这些结构在使用"将警告视为错误"标志时有所帮助,它们不被视为与-MM
和-MMD
的依赖项,这通常很麻烦)
现在解决您的问题。该库经过明显设计,可通过将包含目录ga
的目录添加到包含路径来使用。这应该足够了,因为我不知道任何编译器根据包含标头的文件的包含方式修改其标题的搜索路径。
请注意,c1xx
可能是编译器可执行文件的名称,而不是尝试包含另一个文件的名称(同样,我现在无法确保这种情况,但与cc1plus
相比,这是 GCC 编译器的名称 -g++
是一个处理几件事并执行cc1plus
来处理C++代码编译的驱动程序)
如果你在命令行上这样做:
echo | gcc -v -E -x c++ -
您将获得一个输出,其中包含C++的默认包含目录。这些是内置系统的包含搜索路径。
如果使用g++ -I/some/dir -o foo foo.cpp
进行编译,则会在编译中添加一个额外的包含搜索路径 (/some/dir
)。
上述位置的标头可以通过包含指令(如#include <header>
)找到。#include "header"
指令也可以在这些位置找到标头,但它们与以下情况更相关。
当你执行#include "header"
时,你的编译器将首先尝试查找相对于foo.cpp
目录的"header"(如果它包含它),不管foo.cpp
目录是否在搜索路径中。如果在那里找不到它,它将尝试在包含搜索路径中查找。因此,这与与特定.cpp
文件更相关的标头更相关,并且您不希望将其他包含搜索路径添加到编译中,或者如果您更喜欢使用具有相对路径的包含指令。
因此,如果您使用#include <header>
,header
必须位于某些包含搜索路径、系统或/some/dir
中-I
标志。如果header
相对于foo.cpp
,但不在搜索路径中,则编译将失败。
如果使用#include "header"
并且header
不在任何包含搜索路径中,则仍然可以相对于foo.cpp
位置找到它。