我正在制作模拟器并编写了大量文件和标题。问题是每当我包含一个文件时,我都会给出特定文件的相对路径。例如,我的应用程序中的典型代码将像
一样开始#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。任何帮助将受到高度赞赏。
答案 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
确实打字有点多,但它有助于保持整洁:
答案 5 :(得分:0)
任何好的IDE或makefile都允许您列出文件的相对搜索路径。请查看此解决方案。