/tmp/ccIMYTxf.o:在函数‘main'中:
hw2.cpp:(.text+0x10):对‘Solution::Say()'未定义的引用
collect2: 错误:ld 返回 1
这时Make就该大显身手了。
首先我们还需要了解一下makefile。
在项目的根目录下创建一个makefile文件,以告诉Make如何编译和链接程序。
build : hw2.o solution.o
g++ -o build hw2.o solution.o #注意前面必须是tab,不能是空格
hw2.o : hw2.cpp solution.h
g++ -g -c hw2.cpp
solution.o : solution.h solution.cpp
g++ -g -c solution.cpp
clean :
rm hw2.o solution.o build
先来解释一下makefile的基本语法规则:
target ... : prerequisites ...
command #注意前面是tab
target是一个目标文件,可以是Object File,也可以是执行文件,还可以是一个标签;
prerequisites是要生成那个target所需要的文件或是目标;
command是make需要执行的命令(任意的Shell命令)。
说白了就是target这一个或多个目标,依赖于prerequisites列表中的文件,其执行规则定义在command里。如果prerequisites列表中文件比target要新,就会执行command,否则就跳过。这就是整个make过程的基本原理。
那么,我们回头看看上面定义的makefile文件,我们解释一下每两行的作用
build : hw2.o solution.o
g++ -o build hw2.o solution.o
target是build,依赖于hw2.o 和 solution.o,执行的命令是 g++ -o build hw2.o solution.o
意思是通过g++链接hw2.o和solution.o,生成可执行文件build,prerequisites有两个.o文件,是因为代码里hw2引用了solution.h。
hw2.o : hw2.cpp solution.h
g++ -g -c hw2.cpp
target是hw2.o,依赖于hw2.cpp和solution.h,执行命令是g++ -g -c hw2.cpp
意思是通过g++编译hw2.cpp文件,生成hw2.o文件,g++命令中 -g 表示生成的文件是可调试的,如果没有-g,调试时无法命中断点。
solution.o : solution.h solution.cpp
g++ -g -c solution.cpp
同上,编译solution.cpp文件,生成solution.o文件。
clean :
rm hw2.o solution.o build
这里clean不是一个可执行文件,也不是一个.o文件,它只不过是一个动作名字,类似于label的作用,make不会去找冒号后的依赖关系,也不会自动执行命令。如果要执行该命令,必须在make后显示指出整个动作的名字,如make clean。
好了,接下来说一下make的工作原理。在默认的方式下,我们只需输入make,则发生了以下行为:
a. make在当前目录下找名为makefile或Makefile的文件;
b. 如果找到,它会找文件中的第一个target,如上述文件中的build,并作为终极目标文件;










