linux下的makefile文件
makefile是一种编译规则文件,用于linux系统下对多个源文件的编译,它描述了文件编译的规则,只有只要使用一个make命令就可以自动编译中大型项目,简化了编译操作,但是这个文件需要自己编写。(windows不用makefile,是因为编译器自己集成了这一功能,会自动生成)。
书写规则:
targets : prerequisites
command
或者
targets : prerequisites; command
command
- targets:规则的目标,可以是 Object File(一般称它为中间文件),也可以是可执行文件,还可以是一个标签;
- prerequisites:是我们的依赖文件,要生成 targets 需要的文件或者是目标。可以是多个,也可以是没有;
- command:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。(命令的开始一定要使用TAB键)
编译流程
在编写的时候,可以先生成中间文件.o,然后链接.o来生成最终的可执行文件,.o文件就是对象文件,是可重定向文件的一种。
什么是对象文件?
一般编程的流程为先写源代码,然后编译出对象文件,最后链接出可执行文件。(其实直接编译出可执行文件也是可以的,对象文件的插入应该是为了方便在项目中组织和管理文件)
对象文件分为三种:
可重定位的对象文件:这是上面所说的.o文件,无法直接运行,作为中间文件存在(重定位就是说有一段代码我们需要多次使用,每次都定位到那段地址的开始,这就是重定位)
可执行的对象文件:bat文件就是其中的一种,ls,cat之类的命令都是可执行的对象文件。
可被共享的对象文件:就是so文件,程序运行时动态加载(这里动态加载是说一运行起来就会被加载好),没有main函数,这是与可执行文件的最大区别。
.o文件的好处就是当代码改变时,没改变的.o文件依赖文件时,.o文件不需要重新生成,这大大减少了修改项目后的再次编译的时间,提高编程效率。
了解了.o文件之后,我们就能理解下面的makefile例子了:
main:main.o test1.o test2.o gcc main.o test1.o test2.o -o main main.o:main.c test.h gcc -c main.c -o main.o test1.o:test1.c test.h gcc -c test1.c -o test1.o test2.o:test2.c test.h gcc -c test2.c -o test2.o
过程文件用完后记得清楚,保持文件夹的简洁,可在makefile结尾加上
.PHONY:clean
clean:
rm -rf *.o test
执行make时,它不会被执行,在shell中输入make clean可执行,编译时的中间文件和生成的最终目标文件都会被清除(这里的test是最终目标文件)
以上即为编译的流程。写到这发现时间已经过去了很久。
我最近用到了一个makefile文件,由于时间有限,准备暂时不去系统学习makefile,之后有时间再一个一个补充,这里用加#注释的方式协助读懂我遇到的makefile;
#目标为生成上述可执行文件
TARGET=test_openssl_tls
#这个语义是做变量替换,wildcard函数的功能是列出当前目录下所有符合模式的PATTERN格式的文件名。 SRC=$(wildcard *.cpp)
#patsubst函数说明:函数功能是查找text中的单词是否符合模式pattern,如果匹配的话,则用replacement替换。这里是把SRC中所有.cpp名字改为.o,返会这个.o串 OBJS = $(patsubst %.cpp,%.o,$(SRC))
#做库的变量名 LIBS=-lssl $(TARGET):$(OBJS) g++ $+ -o $@ $(LIBS)
暂时就这些,后续再补充
参考网站:http://c.biancheng.net/makefile/

浙公网安备 33010602011771号