文章目录
Makefile的基本知识
Makefile语法规则:
目标:依赖文件列表
<Tab>:命令列表
示例1-简单的makefile编写
首先写一个main.h,代码如下:
#define PI 3.14
在同目录下,再写一个main.c,代码如下:
#include <stdio.h>
#include "main.h"
int main()
{
printf("hello world %lf\n",PI);
return 0;
}
在终端执行vim Makefile命令,在Makefile文件中写入以下内容
main:mian.c main.h
gcc main.c -o main
clean:
rm main
make命令格式
make [-f file] [option] [targets]
[-f file]:make 默认工作目录中寻找名为GUNmakefile,makefile,Makefile作为makefile输入文件,-f 可以指定其他名字的文件作为makefile输入文件
[option] :
-v:显示make工具的版本信息
-w:在处理makefile之前和之后显示工作路径
-C dir:读取makefile之前改变工作路径至dir目录
-n: 只打印执行的命令但不执行
-s:执行但不显示执行命令
Makefile中的变量
1、自定义变量
在makefile中定义的变量
make工具传给makefile的变量
2、系统环境变量
make工具解析makefile之前,读取环境变量并且设置为makefile的变量
3、预定义变量
这些变量具有特殊含义,可直接在makefile中使用
$@: 目标名
$*目标名中除含扩展名的部分,扩展名包括:S,s,C,c,cc,cp,cpp,o等
$<:依赖文件列表中的第一个文件
$^:依赖列表文件中除去重复文件的部分
$+:依赖列表中所有的文件
$?:依赖列表中比目标文件新的文件
示例2-使用变量的makefile编写
1、用vim写一个简单的hello.c
#include <stdio.h>
int main()
{
printf("hello world");
return 0;
}
2、在终端执行vim Makefile命令,在Makefile文件中写入以下内容
cc=gcc
exec=hello
cflags=-Wall -g
obj=hello.o
$(exec):$(obj)
$(cc) $(obj) -o $@ $(cflags)
$(obj):hello.c
$(cc) -c $< -o $@ $(cflags)
clean:
rm *.c,$(exec),*.o
执行结果如下图所示:
编写多文件编程的Makefile
当需要makefile多个文件该如何编写呢?即,源文件中需要调用头文件中的包含的库或函数该如何写makefile。以下这个例子可以供作参考:
示例3-多文件编程的Makefile
1、写一个hello.h文件内容如下:
#include <stdio.h>
2、写一个hello.c文件内容如下:
#include "hello.h"
int main()
{
printf("hello world");
return 0;
}
可用两种方法实现,这里直接放代码截图
方法1
方法2
可以用变量对这两个方法进行优化,这里我偷懒就不做了。
使用autotools生成包含多文件的Makefile
这里不说autotools如何安装了,大家可以自行百度。
1、新建一个名为“auto”文件夹,将示例2的hello.c拷贝进去。
2、使用autoscan生成configure.scan。(以上命令运行截图如下所示)
3、编辑configure.scan,修改相关内容,并将其重命名为configure.ac(configure.ac的内容截图如下所示)。
4、使用aclocal生成aclocal.m4。
5、使用autoconf生成configure。
6、使用autoheader生成config.h.in。(以上几个命令的运行如下图所示)
7、创建Makefile.am并且编辑。文件内容如下图所示:
8、使用automake --add-missing生成Makefile.in。
9、使用./configure生成Makefile。命令执行如下图所示:
10、使用make生成hello可执行文件,并在当前目录下运行hello查看结果。
结果如下图所示:
11、也可以make install将hello安装到系统目录下,运行查看结果。