Linux Makefile通用模板详解_第1页
Linux Makefile通用模板详解_第2页
Linux Makefile通用模板详解_第3页
Linux Makefile通用模板详解_第4页
Linux Makefile通用模板详解_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论