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/

posted @ 2020-12-23 23:18  代码非马  阅读(629)  评论(0)    收藏  举报