Linux学习入门--make学习总结

巧了我就是萌 提交于 2020-04-07 11:26:49

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的命令一样。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!