为什么 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
我是制作文件的新手,遇到一个问题,当在命令行上 运行 而不是在制作文件中时,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
.
我认为你想要做的是采用这样的规则:
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