如何使用<>而不是""包括

时间:2017-01-01 12:53:36

标签: c++ visual-studio include-path

我正在使用其他人编写的库,这种库基于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>

我使用#include&#34; ga.h&#34;在我的程序中包含该标题。但是很难在库中的每个头文件/源文件中进行更改。

有没有办法让编译器使用&lt;&gt;好像他们是&#34;&#34;? 我尝试将路径添加到&#34;添加包含目录&#34;来自项目属性(我使用Visual Studio),许多内容和#39;错误消失但大约30个持续存在。奇怪的是,它们位于一个名为&#34; c1xx&#34;但我没有那个文件!!

感谢,

5 个答案:

答案 0 :(得分:4)

该定义有点&lt;&gt;用于&#34; system&#34;头文件,通常位于/ usr / include(在类Unix系统上)和&#34;&#34;用于本地头文件。编译代码时,可以指示包含头文件的其他目录的位置,例如使用GCC时使用-I选项。查看编译器的文档以了解所需的设置

所以,例如在Linux和GCC上,如果你的&#34; ga&#34;目录在/ usr / local / include / ga中,你可以使用cc -I / usr / local / include。

答案 1 :(得分:3)

这确实看起来像是告诉编译器在哪里查找包含的头文件的问题。正如其他答案中所述,当您执行 #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 /I\additional\header\path your_file.cpp

我假设您使用的是 Visual Studio - 您也可以从项目属性中进行配置。转到 Configuration Properties > C/C++ > General 并修改 Additional Include Directories。有关详细信息,请参阅以下内容:

Setting C++ compiler and build properties

Additional include directories

答案 2 :(得分:1)

先说说<header><file>的区别。标准(C 和 C++)仅规定

#include <header>

包括一个名为 headerheader 和那个

#include "file"

包含一个名为 file源文件,如果没有找到,则包含一个名为 file 的头文件。

什么是标头以及它们与源文件的区别留给实现。实际上,它们也是文件。因此,#include <header> 在某些地方寻找文件,#include "file" 在其他地方寻找文件,如果在与 #include <file> 相同的地方找不到。

AFAIK 所有编译器

  • 能够在包含包含指令的文件的目录中搜索源文件

  • 能够在默认搜索路径之前获得用于搜索标题的目录列表。

ISTR,Visual C++ 也在间接包含它的文件目录中搜索源文件。 (我目前无法确认我的记忆是否良好;这种行为是 AFAIK 无法用其他编译器实现的,所以我从来没有依赖它,而且——幸运的是?——它从来没有导致我的程序出现不同的行为)。

显然,这种行为或多或少是可定制的。例如,使用 g++ 可以:

  • 禁止在包含 include 指令的文件目录中搜索源文件(使用 -I-,注意 -I- 自 gcc 4.0 起已弃用-- 2005 -- 当 -iquote 被引入并且没有非弃用的方法来实现这一点时)

  • 添加一个目录列表来搜索源文件而不是标题(使用-iquote,它是{{1 }})

  • 在默认目录列表之后给出一个用于搜索headers的目录列表(使用-I-

  • 给出一个目录列表来搜索经过特殊处理的headers(使用-idirafter;对于那些有助于使用“将警告视为错误”标志,它们不会被视为与 -isystem-MM 的依赖关系,这通常很麻烦)


现在解决您的问题。该库明显设计为通过将包含目录 -MMD 的目录添加到包含路径来使用。这应该足够了,因为我不知道任何编译器会根据包含 header 的文件的方式修改 header 的搜索路径。

请注意,ga 可能是编译器可执行文件的名称,而不是试图包含另一个文件的文件的名称(同样,我现在无法确保是这种情况,但与 {{ 1}} 是 GCC 编译器的名称 -- c1xx 是一个驱动程序,处理一些事情并执行 cc1plus 来处理 C++ 代码的编译)

答案 3 :(得分:-1)

看到你的情况不同你在你的项目中使用这个库你必须使用其他标准头文件所以改变包含路径使用,

$ g++ -Ipath_to_galib

不会工作,因为它还会影响其他标准头文件,编译器将无法再找到它们。您需要做的是将完成 galib 文件夹的 ga 文件夹移动到标准路径,就像您使用 linux 然后移动 ga文件夹到 /usr/include/ 目录,一切都将开始正常工作,如果您使用的是 MacWindows,则在 google 上搜索您的 {{1} 头文件的标准路径}.

答案 4 :(得分:-2)

如果你在命令行上执行:

echo | gcc -v -E -x c++ -

您将获得带有C ++默认包含目录的输出。这些是内置系统,包括搜索路径。

如果使用g++ -I/some/dir -o foo foo.cpp进行编译,则需要在编辑中添加其他包含搜索路径(/some/dir)。

上述位置的标题可以通过#include <header>等包含指令找到。 #include "header"指令也可以在这些位置找到标题,但它们与以下情况更相关。

当您执行#include "header"时,您的编译器将首先尝试查找&#34; header&#34;相对于foo.cpp的目录,如果它包含它,尽管foo.cpp目录在搜索路径中。如果它在那里找不到它,它将尝试在包含搜索路径中查找。因此,对于与特定.cpp文件绑定更多的标题更加相关,并且您不希望在编译中添加其他包含搜索路径,或者您更喜欢使用包含相对路径的include指令。

因此,如果您使用#include <header>,则header必须位于某些包含搜索路径,系统或/some/dir -I标记中。如果header相对于foo.cpp,而不是搜索路径,则编译将失败。

如果您使用#include "header"并且header不在任何包含搜索路径中,则仍可以相对于foo.cpp位置找到它。