在上一篇博文《linux之makefile编写、Linux模块化编程1(最简单的方法)》
中我们介绍了makefile最基础的应用。今天我们来看一下稍微深层次一点的makefile文件的编写!话不多说直接上例子
在当前目录下面我有三个.c
文件分别是qq.c qq1.c qq2.c
这三个是独立的文件,每个文件都可以编译成一个可执行文件。也就是说这个三个文件包含3个主函数(三个main
函数)。这样我们要如何来进行makefile文件的编写呢?
首先我们还是先建立一个makefile文件执行指令touch makefile
。上图我已经建立过了,这里就不重复了!
然后执行vim makefile
打开makefile文件。并写一下指令!如图:
all: qq1 qq2 qq
qq1: qq1.c
gcc qq1.c -lpthread -o qq1
qq2: qq2.c
gcc qq2.c -lpthread -o qq2
qq: qq.c
gcc qq.c -lpthread -o qq
clean:
rm qq1 qq2 qq
我们来解释一下指令。all: qq1 qq2 qq
这一句指令的作用就是让makefile在编译一个主函数main函数
后不会停止,依然依序继续下去。要注意all
必须放在最上面,后面更的内容是文件编译后的文件。像qq
则是qq.c编译后的文件.
qq: qq.c
gcc qq.c -lpthread -o qq
我们看一些这一句代码,实际上这一句格式在这篇文章《linux之makefile编写、Linux模块化编程1(最简单的方法)》中我已经做过解释了,这里回顾一下我们再说一下。A: B
也就是将B
编译成文件A,前面写要编译成的文件的名称,然后:
在接一个空格
后面是你要编译的文件。第二句记得tap
键,然后写你需要执行的指令。gcc qq.c -lpthread -o qq
解释一下-lpthread
加这个参数原因是qq.c
这个.c
文件里面的代码含有线程部分,所以要加这个,-o
是给编译后的文件命名的参数,如果没有这个参数,编译后就是a.out
文件,显而不方便查找。
其他两句都是同理。clean
在上一章已经讲过了这里就不在解释了。
我们来运行一下看看。
其中有一段警告是程序的问题不影响的。看一下编译后生成的文件qq qq1 qq2
都是存在的,说明编译没有问题。上运行结果证实一下吧!
程序运行没有问题,说明makefile写的没有错!
看一下这个makefile文件里面有好多重复的东西,有没有声名简单的方法呢?当然有啊!
就拿上面那个例子吧,
lsp = gcc
all: qq1 qq2 qq
qq1: qq1.c
$(lsp) qq1.c -lpthread -o qq1
qq2: qq2.c
$(lsp) qq2.c -lpthread -o qq2
qq: qq.c
$(lsp) qq.c -lpthread -o qq
clean:
rm qq1 qq2 qq
这就相当于宏定义
将gcc进行定义,这样如果需要更改别的编译器不就方便太多了吗,调用的时候只需要$(定义的参数)
就好,像别的库的链接,一些指令等都是可以使用相同的办法的。在实际编程中也建议这种方法,大大减小了错误的可能。
好了这一章的makefile就先到这里了。makefile系列的第二篇完结,因为我想让基础比较薄弱的人们看的更加简单点所以稍显啰嗦。makefile还有最后一个系列《Linux之makeflie编写3》就讲完了,难点也都放在哪里面了,近期更新。
欢迎指正交流,感谢大家!