我目前正在开发一个大型金融应用程序。
有多个模块单独编译,然后组合到更高级别的生成文件中。
由于设计不佳,许多头文件包含许多本地包含。
我的问题是,当我在当前的源文件
/src/rwBatch/calcVol.C
中包含/src/equity/pdeModels/EqUtil.H
时,EqUtil.H 开头的所有包含都开始中断,给出错误:../../equity/pdeModels/EqUtil.H:15:30: fatal error: ulbase/SpotPrice.H: No such file or directory compilation terminated.
rwBatch
和equity
文件夹将分别编译并稍后链接在一起。这是生成文件的问题吗?或者我应该如何解决这个问题?
深入示例:
/src/Module1/file1.C/
src/Module2/folderA/file2.H/
src/Module2/folderB/file3.
H
当我在文件1中写入#include "../folderA/file2.H"
时。C 由于 file2.H. 在
file2 的开头出现错误。H 有几个包含,例如#include "/folderB/file3.H"
,当编译在 file1 中时。C 导致fatal error: /folderB/file3.H: No such file or directory compilation terminated
。
这是生成文件的问题吗?或者我应该如何解决这个问题?
在#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"
在您的生成文件(或其他构建系统)中:
gcc -I/src/Module2/folderA -I/src/Module2/folderB -c /src/Module1/file1.C -o /wherever/file1.o
如果存在名称冲突,并且您的模块依赖于两个同名的标头,则有一些选择。最简单 - 也可能是最好的 - 是重命名一个或两个标头。如果确实必须,可以将路径放入#include
语句中,但路径应反映您使用的目录结构,而不是相反。