在makefile中使用.o文件

时间:2013-08-15 12:34:09

标签: c++ makefile

我刚学到一些关于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

之间有什么区别

2 个答案:

答案 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.cppg++ -c main.cpp创建。

最终,.o的所有文件都会创建可执行文件hello,如

中所述
hello: main.o factorial.o hello.o
     g++ main.o factorial.o hello.o -o hello