如何避免在C或C ++ #include指令中明确声明目录路径?

时间:2010-04-29 23:34:45

标签: c++ c header

我正在制作模拟器并编写了大量文件和标题。问题是每当我包含一个文件时,我都会给出特定文件的相对路径。例如,我的应用程序中的典型代码将像

一样开始
#ifndef AI_H
#define AI_H

#include <cstdlib>

#include "../world/world.h"
#include "pathPlan.h"
#include "skills/tryskill.h"
#include "../info/condition.h"
#include "dataStructures/destination.h"
#include "../params/gamePlay.h"
#include "../modules/controlModule.h"


class ai
{
    public:

etc etc

我想避免使用相对路径。例如,我想直接包含“tryskill.h”和“destination.h”而不给出绝对路径。这样,如果我改变任何特定文件的位置,我不需要打扰。我正在使用Ubuntu 9.10。任何帮助将受到高度赞赏。

6 个答案:

答案 0 :(得分:2)

通常,如果您从命令行进行编译,则会为编译器提供包含搜索路径(gcc示例:http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html)。如果您使用的是IDE,则应该能够为IDE指定包含搜索路径,IDE会将这些路径传递给您的编译器。

答案 1 :(得分:2)

确实这完全取决于你的包含路径,不同的编译器可能会把它称为不同的东西但是在gcc中

-Idir  Append directory dir to the list of directories searched for include files.

因此,在您的示例中,您将在../world etc...

目录列表中指定-I

答案 2 :(得分:1)

编译器将允许您在命令行(或响应/配置文件)上指定要搜索头文件的目录。如果您使用其中一种工具驱动构建,通常可以在makefile或IDE的项目设置中进行配置。

但是,一般来说,我更喜欢指定“属于”项目的标题的相对路径(而不是可能跨项目使用的库)。这样,当您添加新模块时,您不必使用项目设置或制作文件来继续构建。

如果您希望将模块的标头与模块的实现保持在一起,而不是将标头堆积到单个(或一小组)目录中。任何一个组织都可以说是另一个组织。

答案 3 :(得分:1)

您应该使用与程序/库的顶级包含路径相关的路径。有许多不同的方法可以执行此操作,具体取决于您构建程序的方式。如果您正在使用CMake构建系统 - 我强烈建议您使用 - 那么您将使用INCLUDE_DIRECTORIES命令:

INCLUDE_DIRECTORIES(include)

如果您的“info / condition.h”文件位于“include / blah / info / condition.h”中,那么您可以将其包含在:

#include <blah/info/condition.h>

如果使用g ++从命令行进行编译,则可以使用-I命令行开关:

g++ file1.cpp file2.cpp ... fileN.cpp -I./include

如果您正在使用Make,则可以通过添加以下行来确保使用此标志:

CPPFLAGS += -I./include

另一种可能性,虽然我不建议,是定义环境变量CPATH

# Note the following is what you would do in BASH:
export CPATH="$CPATH":"`pwd`/include"

答案 4 :(得分:1)

思考的食物:替代方案是什么?

#include "pathPlan.h"
#include "exception.h"
#include "world.h"
#include "exception.h" // uh ?

我总是担心在include paths变量中声明的路径太多,问题是路径越多,你就越有可能得到文件名冲突,而且调试真的很烦人。 / p>

我更喜欢使用它:

// 3rd party libraries
#include <3rdParty1/foo.h>
#include <3rdParty2/foo.h>

// Projects I depend on
#include "myProject1/bar.h"

// Current project, from the include directory
#include "currentProject/foobar.h"
#include "currentProject/another.h"

// Current project, from the source directory (private includes)
#include "../world.h"
#include "../detail/helper.h"

对于给定项目“thingy”,这意味着我有以下文件:

// in thingy/1-3-0-2/include/thingy/foo.h

namespace thingy  // base namespace is project name
                  // namespace hierarchy identical to folders hierarchy
{
}

然后我在编译行上有以下内容:

-I${Repository}/thingy/1-3-0-2/include

确实打字有点多,但它有助于保持整洁:

  • 命名空间/文件夹关联可以更轻松地找到文件的位置
  • 项目前缀使得来自不同项目的2个文件即使在具有相同名称时也无法混淆

答案 5 :(得分:0)

任何好的IDE或makefile都允许您列出文件的相对搜索路径。请查看此解决方案。