版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页LinuxMakefile通用模板详解1、写在前面
对于Windows下开发,很多IDE都集成了编译器,如VisualStudio,提供了“一键编译”,编码完成后只需一个操作即可完成编译、链接、生成目标文件。
(Linux)开发与Windows不同,Linux下一般用的的gcc/g++编译器,如果是开发(ARM)下的Linux程序,还需用到arm-linux-gcc/arm-linux-g++交叉编译器。
Linux下也可以实现“一键编译”功能,此时需要一个编译脚本“Makefile”,Makefile可以手动编写,也可以借助自动化构建工具(如scons、CMake)生成。手动编写Makefile是Linux和Windows(程序员)的区别之一,一般地一个通用的Makefile能够适合大部分Linux项目程序。
2、3个Makefile模板
2.1编译可执行文件Makefile
VERSION
=1.00CC
=gccDEBUG
=-DUSE_DEBUGCFLAGS
=-WallSOURCES
=$(wildcard
./source/*.c)INCLUDES
=-I./includeLIB_NAMES
=-lfun_a
-lfun_soLIB_PATH
=-L./libOBJ
=$(patsubst
%.c,
%.o,
$(SOURCES))TARGET
=app#links$(TARGET):$(OBJ)
@mkdir
-p
output
$(CC)
$(OBJ)
$(LIB_PATH)
$(LIB_NAMES)
-o
output/$(TARGET)$(VERSION)
@rm
-(rf)
$(OBJ)
#com(pi)le%.o:
%.c
$(CC)
$(INCLUDES)
$(DEBUG)
-c
$(CFLAGS)
$
【要点说明】
【1】程序版本
开发调试过程可能产生多个程序版本,可以在目标文件后(前)增加版本号标识。
VERSION
=
1.00$(CC)
$(OBJ)
$(LIB_PATH)
$(LIB_NAMES)
-o
output/$(TARGET)$(VERSION)
【2】编译器选择
Linux下为gcc/g++;arm下为arm-linux-gcc;不同(CPU)(厂商)提供的定制交叉编译器名称可能不同,如Hisilicon“arm-hisiv300-linux-gcc”。
CC
=
gcc
【3】宏定义
开发过程,特殊代码一般增加宏条件来选择是否编译,如调试打印输出代码。-D是标识,后面接着的是“宏”。
DEBUG
=-DUSE_DEBUG
【4】编译选项
可以指定编译条件,如显示警告(-Wall),优化等级(-O)。
CFLAGS
=-Wall
-O
【5】源文件
指定源文件目的路径,利用“wildcard”获取路径下所有依赖源文件。
SOURCES
=$(wildcard
./source/*.c)
【6】头文件
包含依赖的头文件,包括源码文件和库文件的头文件。
INCLUDES
=-I./include
【7】库文件名称
指定库文件名称,库文件有固定格式,静态库为libxxx.a;动态库为libxxx.so,指定库文件名称只需写“xxx”部分,
LIB_NAMES
=-lfun_a
-lfun_so
【8】库文件路径
指定依赖库文件的存放路径。注意如果引用的是动态库,动态库也许拷贝到“/lib”或者“/usr/lib”目录下,执行应用程序时,系统默认在该文件下索引动态库。
LIB_PATH
=-L./lib
【9】目标文件
调用“patsubst”将源文件(.c)编译为目标文件(.o)。
OBJ
=$(patsubst
%.c,
%.o,
$(SOURCES))
【10】执行文件
执行文件名称
TARGET
=app
【11】编译
%.o:
%.c
$(CC)
$(INCLUDES)
$(DEBUG)
$(CFLAGS)
$
【12】链接
可创建一个“output”文件夹存放目标执行文件。链接完输出目标执行文件,可以删除编译产生的临时文件(.o)。
$(TARGET):$(OBJ)
@mkdir
-p
output
$(CC)
$(OBJ)
$(LIB_PATH)
$(LIB_NAMES)
-o
output/$(TARGET).$(VERSION)
@rm
-rf
$(OBJ)
【13】清除编译信息
执行“makeclean”清除编译产生的临时文件。
.PHONY:cleanclean:
@echo
"Remove
linked
and
compi(led)
files"
rm
-rf
$(OBJ)
$(TARGET)
output
2.2编译静态库Makefile
VERSION
=CC
=gccDEBUG
=CFLAGS
=-WallAR
=arARFLAGS
=rvSOURCES
=$(wildcard
*.c)INCLUDES
=-I.LIB_NAMES
=LIB_PATH
=OBJ
=$(patsubst
%.c,
%.o,
$(SOURCES))TARGET
=libfun_a#link$(TARGET):$(OBJ)
@mkdir
-p
output
$(AR)
$(ARFLAGS)
output/$(TARGET)$(VERSION).a
$(OBJ)
@rm
-rf
$(OBJ)#compile%.o:
%.c
$(CC)
$(INCLUDES)
$(DEBUG)
-c
$(CFLAGS)
$
【要点说明】
基本格式与“编译可执行Makefile”一致,不同点包括以下。
【1】使用到“ar”命令将目标文件(.o)链接成静态库文件(.a)。静态库文件固定命名格式为:libxxx.a。
2.3编译动态库Makefile
VERSION
=CC
=gccDEBUG
=CFLAGS
=-fP(IC)
-shared
LFLAGS
=-fPIC
-shared
SOURCES
=$(wildcard
*.c)INCLUDES
=-I.LIB_NAMES
=LIB_PATH
=OBJ
=$(patsubst
%.c,
%.o,
$(SOURCES))TARGET
=libfun_so#link$(TARGET):$(OBJ)
@mkdir
-p
output
$(CC)
$(OBJ)
$(LIB_PATH)
$(LIB_NAMES)
$(LFLAGS)
-o
output/$(TARGET)$(VERSION).so
@rm
-rf
$(OBJ)
#compile%.o:
%.c
$(CC)
$(INCLUDES)
$(DEBUG)
-c
$(CFLAGS)
$
【要点说明】
基本格式与“编译可执行Makefile”一致,不同点包括以下。
【1】编译选项和链接选项增加“-fPIC-shared”选项。动态库文件固定命名格式为libxxx.so。
3、Demo
3.1编译应用程序
编写测试例程,文件存放目录结构如下,头文件存放在“include”目录,库文件存放在“lib”目录,源文件存放在“source”目录,Makefile在当前目录下。
源码1:
/*头文件*/#ifndef
_FUN0_H_#define
_FUN0_H_#endifex(te)rn
void
fun0_printf(void);extern
void
fun1_printf(void);/*源文件*/#include
#include
"fun0.h"void
fun0_printf(void){
printf("Call
'fun0'.
");}
源码2:
/*头文件*/#ifndef
_FUN1_H_#define
_FUN1_H_#endifextern
void
fun1_printf(void);/*源文件*/#include
#include
"fun1.h"void
fun1_printf(void){
printf("Call
'fun1'.");}
主函数源码:
/*源文件*/#include
#include
"fun0.h"#include
"fun1.h"#include
"fun_lib_a.h"#include
"fun_lib_so.h"int
main(void){
#ifdef
USE_DEBUG
printf("Debug
Application
startup.");
#endif
fun0_printf();
fun1_printf();
fun_lib_a_printf();
fun_lib_so_printf();
return
0;}
库文件,“./lib”目录下存放两个库文件,一个静态库libfun_a.a,一个动态库libfun_so.so。
Makefile文件即为“2.1节”的Makefile模板。
测试运行:
【如果执行文件提示无“libfun_so.so”,则需拷贝“libfun_so.so”到根目录下的“/lib”或者“/usr/lib”目录下,因为系统执行程序,默认从该路径引脚动态库】
3.2生成静态库
编写测试例程,生产的库文件即为“3.1节”调用的库文件(libfun_a.a)。文件存放目录结构如下:
源文件:
/*头文件*/#ifndef
_FUN_LIB_A_H_#define
_FUN_LIB_A_H_#endifextern
void
fun_lib_a_printf(void);/*源文件*/#include
#include
"fun_lib_a.h"void
fun_lib_a_printf(void){
printf("Call
'fun_lib_a'.");}
Makefile文件即为“2.2节”的Makefile模板。
编译生成静态库:
3.3生成动态库
编写测试例程,生产的库文件即为“3.1节”调用的库文件(libfun_so.so)。文件存放目录结构
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保险法律法规考点模拟试题
- 保险代理人资格考试保险营销策略与客户关系管理专项试卷
- 网络建设供货实施方案
- 我国医疗器械的研究报告
- 大模型+法律咨询智能法律助手研究报告
- 2026年人类基因编辑伦理道德讨论试题及答案解析
- (2026)烟花爆竹经营单位主要负责人考试题库及参考答案
- 2026江苏省高考生物模拟试题试卷+参考答案
- 2026年《临床药物治疗学》期末考试复习题库含答案详解(考试直接用)
- 2026中国红外热成像芯片军民两用市场发展前景报告
- 部编版小学一年级语文单韵母aoeiuu课件
- 第六章人体生命活动的调节测试卷2026-2027学年人教版八年级上册生物
- 谐音梗挑战课件
- GB/T 36213-2026船舶和海上技术船舶系泊和拖带设备系泊导缆孔
- 2026年安徽省中考数学试卷(含答案及解析)
- 2026年8上物理1单元试卷及答案
- 《JBT 13298-2017YE3系列(IP23)三相异步电动机技术条件(机座号160~355)》专题研究报告
- 面包厂检验室工作制度
- 新课堂、新课堂、新高考++2025年版《普通高中语文课程标准》解读
- 铁路局实习岗位考核制度
- 客运驾驶员安全课件
评论
0/150
提交评论