我刚学到一些关于makefile的内容,这是我的第一个问题。我有main.cpp hello.cpp factorial.cpp和functions.h文件
all: hello
hello: main.o factorial.o hello.o
g++ main.o factorial.o hello.o -o hello
main.o: main.cpp
g++ -c main.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
hello.o: hello.cpp
g++ -c hello.cpp
clean:
rm -rf *o hello
在上面的代码中,为什么文件有扩展名.o?不应该是.cpp或使用.cpp和.o
之间有什么区别答案 0 :(得分:4)
构建C ++程序分为两个阶段。首先,将编译每个.cpp
文件放入.o
目标文件中。编译将源代码转换为机器代码,但不解析来自其他源文件的函数调用(因为它们尚未编译)。
main.o: main.cpp
g++ -c main.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
hello.o: hello.cpp
g++ -c hello.cpp
其次,您链接对象文件以创建可执行文件。链接解析每个目标文件中的外部引用。
hello: main.o factorial.o hello.o
g++ main.o factorial.o hello.o -o hello
顺便说一下,clean
目标中存在拼写错误。 *o
应为*.o
。
clean:
rm -rf *.o hello
答案 1 :(得分:2)
.o
表示“对象文件”,这些是从源编译但尚未链接到可执行文件或库的文件。
在你的制造文件中,即
main.o : main.cpp
表示main.o
将使用main.cpp
从g++ -c main.cpp
创建。
最终,.o
的所有文件都会创建可执行文件hello
,如
hello: main.o factorial.o hello.o
g++ main.o factorial.o hello.o -o hello