C ++包括相对路径损坏

时间:2018-03-19 18:24:05

标签: c++ makefile path include relative

我目前正在开展大规模的财务申请。

有多个模块单独编译,然后组合在更高级别的makefile中。

由于设计不佳,许多头文件包含许多本地包含。

我的问题是,当我在当前源文件/src/equity/pdeModels/EqUtil.H中包含/src/rwBatch/calcVol.C时,EqUtil.H开头的所有包含开始中断,给出错误:{{1 }}

../../equity/pdeModels/EqUtil.H:15:30: fatal error: ulbase/SpotPrice.H: No such file or directory compilation terminated.rwBatch文件夹分别编译并在以后链接在一起。这是makefile的问题吗?或者我该如何解决这个问题?

深入的例子:

/src/Module1/file1.C
/src/Module2/folderA/file2.H
/src/Module2/folderB/file3.H

当我在file1.C中写equity时,由于file2.H而有错误。
在file2.H的开头有几个包含,例如#include "../folderA/file2.H",当在file1.C中编译导致#include "/folderB/file3.H"

这是makefile的问题吗?或者我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

#include语句中指定路径几乎总是一个坏主意。它需要构建器所需的信息,而不是代码所需的信息,并将其锁定到代码中。

只要没有名称冲突(例如folderA/file3.hfolderB/file3.h),您就可以删除这些路径。改变这些:

// file1.c:
#include "../folderA/file2.H"

// file2.H:
#include "/folderB/file3.H"

到这些:

// file1.c:
#include "file2.H"

// file2.H:
#include "file3.H"

在你的makefile(或其他构建系统)中:

gcc -I/src/Module2/folderA -I/src/Module2/folderB -c /src/Module1/file1.C -o /wherever/file1.o

如果名称冲突,并且您的模块依赖于两个具有相同名称的标头,则您有一些选项。最简单 - 也许最好 - 是重命名一个或两个标题。如果你真的必须,你可以将路径放入#include语句,但路径应该反映你使用的目录结构,而不是反过来。