目录
语法
目标:依赖文件
命令(需要用tab)
通过依赖文件生成目标文件
执行
make
make -f 文件名 指定文件名
makefile可以有多个目标,默认执行第一个目标,make 目标 可以指定执行哪个目标
变量
自定义变量
变量名 = 变量值(没有类型)
使用变量$(变量名)
终端下 #make 变量名 = 变量值(可以在终端给变量传值)
系统环境变量
例如pwd等系统环境变量都可以,只不过在makefile中需要大写
实际上其实没啥意义
预定义变量
$@ 目标名
$< 依赖文件列表中的第一个文件
$^ 依赖文件列表会删除重复的
makefile
代码
test.h
#include <stdio.h>
#define PI 3.1415926
void func();
test.c
#include "test.h"
int main()
{
printf("%lf\n",PI);
func();
return 0;
}
test2.c
#include "test.h"
void func()
{
printf("hello world\n");
}
makefile
test:test.c
gcc test.c test2.c -o test
remove:
rm test
修改单独文件可以节省编译时间
test:test.o test2.o
gcc test.o test2.o -o test
test.o:test.c
gcc -c test.c -o test.o
test2.o:test2.c
gcc -c test2.c -o test2.o
clean:
rm -rf test *.o
自定义变量替换
exec = test
#环境不同命令会有些差别
cc = gcc
#cc = arm-linux-gcc
obj = test.o test2.o
#-Wall 警告 -g 调试
cflags = -Wall -g
#cflags = -g
$(exec):test.o test2.o
$(cc) $(obj) -o $(exec) $(cflags)
test.o:test.c
$(cc) -c test.c -o test.o $(cflags)
test2.o:test2.c
$(cc) -c test2.c -o test2.o $(cflags)
clean:
rm -rf $(exec) *.o
预定义变量替换(最终版本)
exec = test
cc = gcc
#其实真的需要修改的基本也只有下面这一行,生成目标文件名字可以改成自己喜欢的.
obj = test.o test2.o
#-Wall 警告 -g 调试
cflags = -Wall -g
#cflags = -g
$(exec):$(obj)
$(cc) $^ -o $@ $(cflags)
#% 这个叫啥实在记不住了,百度了一下也找到标准的说法,不过他其实就是一个可以匹配的东西(逐一匹配)
%.o:%.c
$(cc) -c $< -o $@ $(cflags)
clean:
rm -rf $(exec) *.o
这个东西吧,我也不知道咋说,也不能弄个几千字文字描述不是,然后就只能这样了.
其实这个能写固然是好的,不能写无所谓会用就行,实际工作中基本都是脚本自动生成的
Linux大概就这样了,之后在系统编程里在详细说说,然后开始C++吧.