【问题标题】:C++ Seperate Include and Source directory and #IncludeC ++分离包含和源目录和#Include
【发布时间】:2014-11-05 00:51:41
【问题描述】:

目前在我的应用程序中,我只有一个源代码树

MyApp/Source
|-Precompiled.hpp
|-Precompiled.cpp
|-Thing.hpp
|-Thing.cpp
|-Main.cpp
|-Component
| |-ComponentThing.hpp
| |-ComponentThing.cpp
| |-...
|-ComponentB
| |-ComponentBThing.hpp
| |-...
|-PluginCandiate
| |-PluginThing.hpp
| |-PluginThing.cpp
| |-...
...

但是,我想创建一个插件系统(这样,核心应用程序的一部分就更少了,边界清晰),我想将其中的许多 .hpp 文件移动到单独的 Include\MyApp 树中。所以新树可能看起来像:

MyApp/Include/MyApp
|-Thing.hpp
|-Component
| |-ComponentThing.hpp
| ...
|-ComponentB
| |-ComponentBThing.hpp

MyApp/Source
|-Precompiled.hpp
|-Precompiled.cpp
|-PrivateThing.hpp
|-PrivateThing.cpp
|-Component
| |-ComponentThing.cpp
| |-...
|-ComponentB
| |-...
...

Plugins/PluginCandiate/Source
|-PluginThing.hpp
|-PluginThing.cpp
...

现在使用当前方式,我的包含路径上只有“源”。这意味着例如在ComponentThing.cpp 我可以说:

#include "Precompiled.hpp"
#include "ComponentThing.hpp"
#include "ComponentOtherThing.hpp"
#include "ComponentB/ComponentBThing.hpp"

因为当前目录总是首先在包含路径上。但是,如果我拆分我的公共包含目录和源目录,情况就不再如此了。我可以将 Include/Myapp/ 放在包含路径上,但 Id 仍然需要所有内容的完整组件路径。

有没有一种简单的方法来避免这种情况(使用 MSVC MSBuild 和 Linux make 文件),或者只有完整的#includes 是标准做法?还是人们通常会做其他事情(例如,我考虑了一个从主源代码树“导出”列出的公共标头集的构建后步骤)?

【问题讨论】:

  • 您能否详细说明您的意思:“我可以将 Include/Myapp/ 放在包含路径上,但我仍然需要所有内容的完整组件路径”?
  • 所以说 ComponentThing.cpp 我不需要像“../../Include/MyApp/Component/ComponentThing.hpp”这样的包含废话,但我仍然需要“Component/ComponentThing .hpp” 而不仅仅是“ComponentThing.hpp”

标签: c++ build msbuild makefile project


【解决方案1】:

是的。您只需将路径添加到新的包含文件夹,只需 #include "filename.h" 另一种方法是在包含路径中包含路径中的相对路径。

例如如果你有以下目录树:

+ MyApp
  - file.c
  - file.h
  + Plugins
    + Include
    - pluginheader.h

file.c 中的任何#include 都可以是相对的:

#include "Plugins/Include/pluginheader.h"  

或者您可以将 ./Plugins/Include 添加到您的包含路径中,然后使用

#include "pluginheader.h"  

(您不必指定完整路径,只需指定工作目录的相对路径)

编辑: 这是您可以轻松尝试的事情之一,我认为这就是您根据您的评论提出的问题:

./file.c:

#include <stdio.h>
#include "module/function.h"
int main()
{
  int sum;
  myStruct orange;
  myStruct_insert(&orange, 5, 6);
  sum = myStruct_sum(&orange);
  printf("%d",sum);
  return 0;
}

./module/function.h:

typedef struct{
    int one;
    int two;
}myStruct;

void myStruct_insert(myStruct *apple, int one, int two);

int myStruct_sum(myStruct *apple);

./module/function.c:

#include "function.h"
void myStruct_insert(myStruct *apple, int one, int two)
{
  (*apple).one = one;
  (*apple).two = two;
}

int myStruct_sum(myStruct *apple)
{
  return (*apple).one+(*apple).two;
}

我用gcc file.c ./module/function.c 编译了这个(没有添加包含路径)。它编译没有错误并正确执行:

$ gcc file1.c module/function.c
$ ./a
11
$

因此,您的问题的答案是肯定的,它将包含与编译器当前正在处理的代码相同的文件夹中的标头。或者至少它适用于 GCC。 MSVC 等可能有不同的行为。

但是最好明确指定。它更冗长,但不太容易与类似名称的头文件混淆。

【讨论】:

  • 当然,但这假设每个模块只有一个平面目录,这不是我在说的,我也在谈论包括他们“自己”目录中的东西在内的东西,而不是跨组件/模块包含(其中 ModuleX/ComponentX/ThingX.hpp 有意义,尽管没有那个讨厌的 /Include/)
  • @FireLancer 添加了一个工作示例,我认为它可以更好地捕捉您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2015-01-31
相关资源
最近更新 更多