1. make的作用
可以根据模块的修改情况重新编译链接目标代码,保证目标代码都是由最新的模块组成的。
2. makefile的编写方法
- 格式:
目标:依赖列表
命令
注意命令左侧是Table制表位
- 注释
语句前加#表示注释
- @避免该行显示,因为make默认是显示执行过程的
- \用来接续行比较长的情况,与C语言类似
- 变量的使用,变量一般用大小字母表示,格式: 变量名 = 字符串;引用方式 $(变量名)
- ifeq(val1,val2), else, endif
举个例子来说明
gcc_hello_world.c
--------------------------------
#include <stdio.h>
#include "print.h"
int main(void)
{
print_hello();
return 0;
}
print.c
--------------------------------
#include <stdio.h>
#include "print.h"
void print_hello(void)
{
printf("Hello world!\n");
}
print.h
---------------------------------
#ifndef PRINT_H
#define PRINT_H
void print_hello(void);
#endif
i. Makefile代码:
hello:gcc_hello_world.o print.o
@gcc gcc_hello_world.o print.o -o hello
gcc_hello_world.o:gcc_hello_world.c print.h
gcc -c gcc_hello_world.c
print.o:print.c print.h
gcc -c print.c
clean:
rm -f *.o hello
其中clean是伪目标,在make参数时可以使用,执行结果如下:
ii. 使用变量编写Makefile
OBJ=gcc_hello_world.o print.o
hello:$(OBJ)
gcc $(OBJ) -o hello
gcc_hello_world.o:gcc_hello_world.c print.h
gcc -c gcc_hello_world.c
print.o:print.c print.h
gcc -c print.c
clean:
$(RM) *.o hello
-------------------------------------------------------------------------------------------------------------
明天继续宏定义的实验操作。
修改gcc_hello_world.c如下:
#include <stdio.h>
#include "print.h"
int main(void)
{
#ifdef MACRO
print_hello();
#endif
return 0;
}
CC=gcc
CFLAGS += -DMACRO
TARGETS := hello
all:$(TARGETS)
OBJ=gcc_hello_world.o print.o
$(TARGETS):$(OBJ)
$(CC) $(CFLAGS) $^ -o $@
gcc_hello_world.o:gcc_hello_world.c print.h
gcc -c $(CFLAGS) gcc_hello_world.c
print.o:print.c print.h
gcc -c print.c
clean:
$(RM) *.o hello
:= += ?= 参考文章:Makefile 中:= ?= += =的区别
$^ -o $@可以参考makefile使用说明
其实添加宏定义方法和gcc -D的命令一样。
来源:oschina
链接:https://my.oschina.net/u/3783667/blog/1623762