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

3
我是一个模拟器,已经写了很多文件和头文件。问题在于,每当我包含文件时,我都会给出特定文件的相对路径。例如,我的应用程序中的典型代码将开始像这样:
#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。任何帮助将不胜感激。

既然你在使用Ubuntu,我们可以假设你也在使用GCC吗?你在使用makefile/build系统吗?你在使用IDE吗? - Billy ONeal
5
使用相对路径通常是个不错的主意……但是如果你在两个不同的目录中有相同的文件名怎么办呢?比如,info/constants.hparams/constants.h?你可能想要设置一个基本的包含路径,例如 /includes/ 文件夹,但是任何在其下面的内容都应该作为包含的一部分进行指定。 - Amber
我正在使用QT生成MAKEFILE。是否有一种方法可以编辑PRO文件或MAKEFILE,以便包括搜索头文件的目录? - user269037
6个回答

3

实际上这取决于你的包含路径,不同的编译器可能会称之为不同的名称,但在gcc中

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

今日免费次数已满, 请开通会员/明日再来

2

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

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

我一直对在包含路径变量中声明太多路径持谨慎态度,问题在于路径越多,文件名冲突的可能性就越大,而且调试起来很麻烦。

我更喜欢使用这种方式:

// 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
通常,如果您正在从命令行编译,您需要向编译器提供包含搜索路径(例如gcc:http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html)。如果您使用的是IDE,您应该能够指定包含搜索路径到您的IDE,并且您的IDE将把这些路径传递给编译器。

2
您应该使用相对于您的程序/库的顶层包含路径的路径。有许多不同的方法可以做到这一点,具体取决于您如何构建程序。如果您正在使用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
# 请注意,以下是在BASH中执行的操作:
export CPATH="$CPATH":"`pwd`/include"

我正在使用QMAKE命令生成MAKEFILE,我能否在QMAKE生成的MAKEFILE中手动添加CPPFLAGS += -I./include? - user269037
对于QMAKE,您可以使用变量INCLUDEPATH:http://doc.trolltech.com/4.2/qmake-variable-reference.html#includepath - Michael Aaron Safyan
我应该在哪里加入INCLUDEPATH指令?我尝试在.PRO文件中编写它,但好像没有起作用。 - user269037

1

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

然而,一般来说,我更喜欢为“属于”项目的头文件指定相对路径(而不是可能跨项目使用的库)。这样,当你添加一个新模块时,你不必在项目设置或 makefile 中瞎搞以使事情继续构建。

如果你喜欢将模块的头文件与其实现放在一起,而不是将头文件堆积在单个(或少量)目录中,那么这就是你需要的。任何一种组织方式都可以说是同样好的。


我正在使用QT生成MAKEFILE。是否有一种方法可以编辑PRO文件或MAKEFILE,以便包括搜索头文件的目录? - user269037
假设您正在使用qmake来管理makefile,则需要有一个INCLUDEPATH变量,其中列出要搜索的目录:http://doc.trolltech.com/4.6/qmake-variable-reference.html#includepath - Michael Burr
我应该在哪里包含INCLUDEPATH指令?我尝试将其写入.PRO文件中,但似乎没有起作用。 - user269037
在.pro文件的顶部或附近,例如INCLUDEPATH += ../world ./skills。 - Jeremy Friesner

0
任何好的IDE或makefile都可以让您列出文件的相对搜索路径。请为您的解决方案研究一下这个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接