1

我刚刚了解了一些关于 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 有什么区别

4

2 回答 2

5

构建 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
于 2013-08-15T12:38:28.557 回答
2

.o表示“目标文件”,这些是从源代码编译但尚未链接到可执行文件或库的文件。
在您的制作文件中,即

main.o : main.cpp

表示main.omain.cpp使用g++ -c main.cpp.

最终,所有文件.o都将创建可执行文件hello,如中所述

hello: main.o factorial.o hello.o
     g++ main.o factorial.o hello.o -o hello
于 2013-08-15T12:35:04.870 回答