我正在向 Makefile 项目添加依赖文件支持。我已经在之前的 makefile 项目中成功使用了依赖文件数据,但是这次
make
报告了一个我以前从未见过的错误。
使用以下命令生成依赖文件:
g++ -c /path/to/myfile.cpp -O2 -fPIC -Wall -MMD -I/include/path -o myfile.d
文件 myfile.d 已生成,没有任何错误。然后
make
重新加载 makefile 并包含依赖文件:
DEP_FILES=myfile.d
-include $(DEP_FILES)
此时,make 报告这些错误:
myfile.d:1: warning: NUL character seen; rest of line ignored
myfile.d:1: *** missing separator. Stop.
根据我的经验,依赖文件从来都不是一个大挑战。在这种情况下,我实际上是从同一系统上的另一个项目复制了规则。新项目中的目录结构较大,因此出现错误后,我通过将依赖文件存储(并包含)与 Makefile 位于同一目录中来简化问题。但即便如此,问题仍然存在。
在线搜索没有任何帮助。这里可能有什么问题?
GCC 的依赖项生成选项对于输出的去向有点复杂。 在所有情况下,依赖数据都会替换预处理器的正常输出,因为它是外部化的。 在某些情况下,然后生成它而不是目标文件或可执行文件,但在其他情况下,除了目标文件或可执行文件之外还生成它。 根据所执行的情况的不同,其他一些选项(尤其是
-o
)的含义也会有所不同。 其他选项调整生成的依赖文件的详细信息。
在命令中
g++ -c /path/to/myfile.cpp -O2 -fPIC -Wall -MMD -I/include/path -o myfile.d
有两个与依赖文件生成相关的主要选项:
-MMD
和-o myfile.d
。 这些一起说:
同时生成目标文件和依赖文件(
-E
不是隐含的,与某些相关选项不同)
依赖数据将写入
myfile.d
,通过将.d
的后缀myfile.d
替换为.d
来确定
编译结果也写入文件
myfile.d
看起来不仅合理,而且依赖数据很可能被编译的对象覆盖。
应该更好地在同一运行中生成目标文件和依赖项数据的替代方案,忽略系统标头,包括:
g++ -c /path/to/myfile.cpp -O2 -fPIC -Wall -MMD -I/include/path
或
g++ -c /path/to/myfile.cpp -O2 -fPIC -Wall -MMD -I/include/path -o myfile.o
或
g++ -c /path/to/myfile.cpp -O2 -fPIC -Wall -MMD -I/include/path -MF myfile.d -o myfile.o