包含依赖文件时Makefile错误

问题描述 投票:0回答:1

我正在向 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 位于同一目录中来简化问题。但即便如此,问题仍然存在。

在线搜索没有任何帮助。这里可能有什么问题?

makefile dependencies g++ gnu-make
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.