假设现在有一个add.cpp,add.h,main.cpp这三个文件,文件内容如下:
add.cpp:
add.h:
main.cpp:
现在需要编写makefile文件将add.cpp和main.cpp这两个文件进行编译
首先在终端输入vim makefile
makefile文件的内容如下:
main: main.o add.o
g++ main.o add.o -o main
main.o: main.cpp add.h
g++ -c main.cpp -o main.o
add.o: add.cpp add.h
g++ -c add.cpp -o add.o
clean:
rm -rf *.o main
编写完之后在终端输入make即可编译
最后一行的clean的作用是删除编译生成的.o文件和main程序,当用户键入make clean命令时,会删除*.o 和main文件,这样我们想重新编译的时候就可以执行命令: make clean; make。
升级:
可以在makefile加入打印的信息,或者用变量来替换一些文件名:
OBJS = main.o add.o
main: $(OBJS)
g++ $(OBJS) -o main
@echo "testing"
main.o: main.cpp add.h
g++ -c main.cpp -o main.o
add.o: add.cpp add.h
g++ -c add.cpp -o add.o
clean:
rm -rf *.o main
@echo "deleting"
例如上面将main.o add.o用OBJS变量表示,当需要用到main.o add.o时,用$(OBJS)替代
另外用@echo打印信息,echo前面带了@表示不要打印执行该命令时候命令本身的输出,比如
rm -rf *.o main在执行的时候会输出这句命令"rm -rf *.o main" 如果把rm改为@rm,
再make clean的时候就不会输出"rm -rf *.o main"命令本身了
可以使用一些预定义变量
$@ : 冒号左边要生成的对象名称
例:main: main.o add.o
$@指的就是其中的main
$< : 冒号右边第一个依赖对象,即上面命令中的main.o
$^ : 冒号右边所有的依赖对象,即上面命令中的main.o add.o
例如:
OBJS = main.o add.o
main: $(OBJS)
g++ $(OBJS) -o main
@echo $@
@echo $<
@echo $^
main.o: main.cpp add.h
g++ -c main.cpp -o main.o
add.o: add.cpp add.h
g++ -c add.cpp -o add.o
@echo $@
@echo $<
@echo $^
clean:
rm -rf *.o main
@echo "deleting"
输入make之后打印终端显示出来的结果为:
g++ -c main.cpp -o main.o
g++ -c add.cpp -o add.o
add.o (注:$@)
add.cpp (注:$<)
add.cpp add.h (注:$^)
g++ main.o add.o -o main
main(注:$@)
main.o(注:$<)
main.o add.o (注:$^)
所以我们可以用预定义变量简化makefile的编写:
将上述makefile用预定义变量替换后为:
OBJS = main.o add.o
main: $(OBJS)
g++ $^ -o $@
main.o: main.cpp add.h
g++ -c $< -o $@
add.o: add.cpp add.h
g++ -c $< -o $@
clean:
rm -rf *.o main
@echo "deleting"