关于makefile 快速掌握模板教程
- 2019 年 12 月 10 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44580977/article/details/103417556
1.想一想我们如果没有makefile的时候是如何生成可执行程序的呢? 第一步. g++ -E test.cpp //预处理替换掉宏定义 第二步. g++ -S test.cpp //会生成test.s的汇编程序 第三步. g++ -c test.cpp //生成目标文件 第四步. g++ test..o test.out -I ACE //连接.o文件,至此完成生成可执行文件test.out .out 是自定义目的是为了标识可执行文件.
2 这些步骤如果用makefile呢?他是要怎么做的
从这个小项目去理解makefile原理
项目文件就一个 socketser.cpp
makefile 编写如下
1 test: server 2 g++ socketser.o -o test.out 3 server: 4 g++ -c socketser.cpp 5 6 .PHONY:clean 7 clean: 8 rm test.out socketser.o
有了makefile就不考虑前两步了, 我们首先看第二行,我们要做的就是告诉makefile, 我们要生成test.cpp 需要连接目标文件(.o 文件),才能生成 test.out. makefile在输入make指令运行后,他会找到第二行,一看-o 后面的参数, 他知道我生成的是test.out 然后找到第二行的那些.o文件, 发现所在目录下面没有这些-o文件,然后他会对应-o文件按顺序对应着第一行server, 找到第三行,执行第四行的命令生成-o文件,回到第二行就成功生成test.out可执行文件了。
3.如果你了解了上面基本可以应对平常入门的项目编译了 下面这个makefile 是行业内makefile的基本格式
分别用到了变量,$()使用 定义的话直接 =就可以 和静态库链接编译 如-pthread
# 源文件名 TCP = TCPClientBase SHM = SHMFIFO OL = OrderList RS232 = RS232Driver MAIN = main DRI = RS232 # 链接源文件 OBJ = $(obj)$(TCP).o $(obj)$(SHM).o $(obj)$(OL).o $(obj)$(RS232).o $(obj)$(MAIN).o #路径 src = ./src/ obj = ./bin/ $(DRI):$(TCP) $(SHM) $(OL) $(RS232) $(MAIN) g++ -g $(OBJ) -o [email protected] -pthread -static /usr/lib/libjson_linux-gcc-5.4.0_libmt.a $(TCP): g++ -g -c $(src)[email protected] -o $(obj)[email protected] $(SHM): g++ -g -c $(src)[email protected] -o $(obj)[email protected] $(OL): g++ -g -c $(src)[email protected] -o $(obj)[email protected] $(RS232): g++ -g -c $(src)[email protected] -o $(obj)[email protected] $(MAIN): g++ -g -c [email protected] -o $(obj)[email protected] .PHONY:clean clean: -rm $(OBJ) $(DRI).out