为什么 g++ 添加在 makefile 中包含不同的内容?

why does g++ add includes differently within makefile?

我是制作文件的新手,遇到一个问题,当在命令行上 运行 而不是在制作文件中时,g++ 命令可以工作。以下行有效:

g++ -I/home/user/ml/dynet/dynet -I/home/user/ml/dynet main.cpp

但是下面的make文件找不到需要的头文件

ai: main.o
        g++ -I/home/user/ml/dynet/dynet -I/home/user/ml/dynet main.cpp

main.cpp很简单

#include <iostream>
#include "dynet.h"
int main() {
    std::cout << "Hello World!";
    return 0;
}

当我 运行 make 时,我收到无法修复

的错误
user@LAPTOP-AUOAPRL1:~/ml/ai$ make
g++    -c -o main.o main.cpp
main.cpp:3:10: fatal error: dynet.h: No such file or directory
 #include "dynet.h"

为什么同一行会运行不同?当 运行 在 make 中时,它在哪里看?谢谢

GNU Make 的无限智慧选择使用它的 built-in 规则。你可以 运行 没有他们 make --no-builtin-rules。将其作为构建文件的先决条件并不好,但在调试“奇怪的行为”时可能会很有用,因为它可以证明 built-in 规则是否干扰了您的心智模型。

至于智慧本身,你只说如何从main.o构建ai——而不是如何构建main.o。这就是您所看到的 - 构建 main.o.

的 built-in 规则

我认为你想要做的是采用这样的规则:

ai: main.cpp
    g++ ...

小费;您应该更喜欢使用 built-in 规则和变量,因为它使 makefile 更易于管理:

# using built-in variables
CC := g++
CPPFLAGS := -I/home/user/ml/dynet/dynet -I/home/user/ml/dynet

# inspired by built-in rules
ai: main.o
    $(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@

https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html