Makefile知识点分析

什么是makefile?
Makefile文件描述了整个程序的编译,链接等规则。其中包括工程中哪些源文件需要编译以及如何编译,如何最后产生我们需要得到的文件。
好处:可以实现“自动化”编译,写好makefile文件后只需一个make命令,整个工程完全自动编译,提高软件开发的效率。

Makefile可生成的文件类型
一个Makefile文件可生成多个文件,文件可以为以下几种类型:
C/C++的应用程序
C/C++的动态链接库
C/C++的静态链接库

通过一个小例子观察规则

C程序源码:test 对应的makefile文件:
#include<stdio.h> test:hello.c
int main() gcc -o test test.c
{ .PHONY:clean
printf(“demotest”); clean:
return 0; rm -f *.o test
}
注意:每个命令的开头必须以[tab]开头。

makefile的书写规则
规则:用于说明如何生成目标文件,格式如下:
目标:依赖
命令
伪目标:
命令

变量及常用的函数
$^:代表所有依赖文件 $@:代表目标的集合
$<:代表第一个依赖文件 ifeq<a,b> endif
$(patsubst ,, )

常见的系统预变量定义
CROSS_COMPILE(CC):=交叉编译,默认为空
LIBS:=对应链接的相关库
LDFLAGS :=表示编译器会用到的一些优化参数或者库所在的目录
CFLAGS:=表示用于C编译器的选项

什么是动态链接库和静态链接库
库就是通常把一些公用函数制作成函数库,供其它程序使用,这些做成的函数库就是链接库。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
在这里插入图片描述
Makefile的实用模板

执行程序模板
SOURCE := $(%.c)
OBJS := ( p a t s u b s t (patsubst %.c,%.o, (patsubst(SOURCE))
TARGET := test
CC := gcc
LIBS :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
.PHONY:clean
clean:
rm -rf *.o *.so
$(TARGET) : $(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

静态库模板
SOURCE := $(%.c)
OBJS := ( p a t s u b s t (patsubst %.c,%.o, (patsubst(SOURCE))
TARGET := libtest.a
CC := gcc
AR = ar
LIBS :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
.PHONY:clean
clean:
rm -rf *.o *.so
$(TARGET) : $(OBJS)
$(AR) crs $(TARGET) $(OBJS) $(RANLIB) $(TARGET)

动态库模板
SOURCE := $(%.c)
OBJS := ( p a t s u b s t (patsubst %.c,%.o, (patsubst(SOURCE))
TARGET := libtest.a
CC := gcc
LIBS :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
SHARE := -fPIC -shared -o
.PHONY:clean
clean:
rm -rf *.o *.so $(TARGET)
$(TARGET) : $(OBJS)
$(CC) $(CFLAGS) $(SHARE) $@ $(OBJS) $(LDFLAGS) $(LIBS)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值