makefile在编译c++代码时,默认xxx.o文件是依赖xxx.cpp/c文件的,并且自动准备好了从cpp编译.o文件的指令。所以这部分文字是可以省略的。
目录
最简单的情况:
看下面的makefile和main.cpp
按理说,main.o对main.cpp的依赖应该明确的写在makefile里面。但是makefile的自动推导允许你省略这句话
CC := g++
main : main.o
${CC} -o main main.o
#main.o : main.cpp
# ${CC} -o main.o -c main.cpp
.PHONY : clean
clean :
rm *.o main
#include <iostream>
//#include "macro.h"
int main(void){
//std::cout<<PI<<std::endl;
std::cout<<"end"<<std::endl;
std::cin.get();
return 0;
}
效果:
并不单纯的情况(.o不仅依赖.cpp,也依赖其他文件):
引入macro.h
现在main.o不仅依赖一个main.cpp,还依赖macro.h。所以makefile里面要把main.o对macro.h的依赖加上,但是仍不需要添加对main.cpp的依赖:
macro.h
#define PI 3.14159
main.cpp
#include <iostream>
#include "macro.h"
int main(void){
std::cout<<PI<<std::endl;
std::cout<<"end"<<std::endl;
std::cin.get();
return 0;
}
makefile
CC := g++
main : main.o
${CC} -o main main.o
main.o : macro.h
# ${CC} -o main.o -c main.cpp
.PHONY : clean
clean :
rm *.o main
编译运行正常:
修改macro.h
把PI改为3.14。此时makefile里定义了main.o对macro.h的依赖,所以运行make指令会触发对main.o的再次编译:
可见,输出变成了3.14。