我目前正在开展大规模的财务申请。
有多个模块单独编译,然后组合在更高级别的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的问题吗?或者我该如何解决这个问题?
答案 0 :(得分:0)
在#include
语句中指定路径几乎总是一个坏主意。它需要构建器所需的信息,而不是代码所需的信息,并将其锁定到代码中。
只要没有名称冲突(例如folderA/file3.h
和folderB/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
语句,但路径应该反映你使用的目录结构,而不是反过来。