Linux Makefile通用模板詳解_第1頁
Linux Makefile通用模板詳解_第2頁
Linux Makefile通用模板詳解_第3頁
Linux Makefile通用模板詳解_第4頁
Linux Makefile通用模板詳解_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第第頁LinuxMakefile通用模板詳解1、寫在前面

對于Windows下開發(fā),很多IDE都集成了編譯器,如VisualStudio,提供了“一鍵編譯”,編碼完成后只需一個操作即可完成編譯、鏈接、生成目標(biāo)文件。

(Linux)開發(fā)與Windows不同,Linux下一般用的的gcc/g++編譯器,如果是開發(fā)(ARM)下的Linux程序,還需用到arm-linux-gcc/arm-linux-g++交叉編譯器。

Linux下也可以實現(xiàn)“一鍵編譯”功能,此時需要一個編譯腳本“Makefile”,Makefile可以手動編寫,也可以借助自動化構(gòu)建工具(如scons、CMake)生成。手動編寫Makefile是Linux和Windows(程序員)的區(qū)別之一,一般地一個通用的Makefile能夠適合大部分Linux項目程序。

2、3個Makefile模板

2.1編譯可執(zhí)行文件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】程序版本

開發(fā)調(diào)試過程可能產(chǎn)生多個程序版本,可以在目標(biāo)文件后(前)增加版本號標(biāo)識。

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】宏定義

開發(fā)過程,特殊代碼一般增加宏條件來選擇是否編譯,如調(diào)試打印輸出代碼。-D是標(biāo)識,后面接著的是“宏”。

DEBUG

=-DUSE_DEBUG

【4】編譯選項

可以指定編譯條件,如顯示警告(-Wall),優(yōu)化等級(-O)。

CFLAGS

=-Wall

-O

【5】源文件

指定源文件目的路徑,利用“wildcard”獲取路徑下所有依賴源文件。

SOURCES

=$(wildcard

./source/*.c)

【6】頭文件

包含依賴的頭文件,包括源碼文件和庫文件的頭文件。

INCLUDES

=-I./include

【7】庫文件名稱

指定庫文件名稱,庫文件有固定格式,靜態(tài)庫為libxxx.a;動態(tài)庫為libxxx.so,指定庫文件名稱只需寫“xxx”部分,

LIB_NAMES

=-lfun_a

-lfun_so

【8】庫文件路徑

指定依賴庫文件的存放路徑。注意如果引用的是動態(tài)庫,動態(tài)庫也許拷貝到“/lib”或者“/usr/lib”目錄下,執(zhí)行應(yīng)用程序時,系統(tǒng)默認(rèn)在該文件下索引動態(tài)庫。

LIB_PATH

=-L./lib

【9】目標(biāo)文件

調(diào)用“patsubst”將源文件(.c)編譯為目標(biāo)文件(.o)。

OBJ

=$(patsubst

%.c,

%.o,

$(SOURCES))

【10】執(zhí)行文件

執(zhí)行文件名稱

TARGET

=app

【11】編譯

%.o:

%.c

$(CC)

$(INCLUDES)

$(DEBUG)

$(CFLAGS)

$

【12】鏈接

可創(chuàng)建一個“output”文件夾存放目標(biāo)執(zhí)行文件。鏈接完輸出目標(biāo)執(zhí)行文件,可以刪除編譯產(chǎn)生的臨時文件(.o)。

$(TARGET):$(OBJ)

@mkdir

-p

output

$(CC)

$(OBJ)

$(LIB_PATH)

$(LIB_NAMES)

-o

output/$(TARGET).$(VERSION)

@rm

-rf

$(OBJ)

【13】清除編譯信息

執(zhí)行“makeclean”清除編譯產(chǎn)生的臨時文件。

.PHONY:cleanclean:

@echo

"Remove

linked

and

compi(led)

files"

rm

-rf

$(OBJ)

$(TARGET)

output

2.2編譯靜態(tài)庫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)

$

【要點說明】

基本格式與“編譯可執(zhí)行Makefile”一致,不同點包括以下。

【1】使用到“ar”命令將目標(biāo)文件(.o)鏈接成靜態(tài)庫文件(.a)。靜態(tài)庫文件固定命名格式為:libxxx.a。

2.3編譯動態(tài)庫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)

$

【要點說明】

基本格式與“編譯可執(zhí)行Makefile”一致,不同點包括以下。

【1】編譯選項和鏈接選項增加“-fPIC-shared”選項。動態(tài)庫文件固定命名格式為libxxx.so。

3、Demo

3.1編譯應(yīng)用程序

編寫測試?yán)?,文件存放目錄結(jié)構(gòu)如下,頭文件存放在“include”目錄,庫文件存放在“l(fā)ib”目錄,源文件存放在“source”目錄,Makefile在當(dāng)前目錄下。

源碼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'.");}

主函數(shù)源碼:

/*源文件*/#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”目錄下存放兩個庫文件,一個靜態(tài)庫libfun_a.a,一個動態(tài)庫libfun_so.so。

Makefile文件即為“2.1節(jié)”的Makefile模板。

測試運行:

【如果執(zhí)行文件提示無“l(fā)ibfun_so.so”,則需拷貝“l(fā)ibfun_so.so”到根目錄下的“/lib”或者“/usr/lib”目錄下,因為系統(tǒng)執(zhí)行程序,默認(rèn)從該路徑引腳動態(tài)庫】

3.2生成靜態(tài)庫

編寫測試?yán)?,生產(chǎn)的庫文件即為“3.1節(jié)”調(diào)用的庫文件(libfun_a.a)。文件存放目錄結(jié)構(gòu)如下:

源文件:

/*頭文件*/#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節(jié)”的Makefile模板。

編譯生成靜態(tài)庫:

3.3生成動態(tài)庫

編寫測試?yán)?,生產(chǎn)的庫文件即為“3.1節(jié)”調(diào)用的庫文件(libfun_so.so)。文件存放目錄結(jié)構(gòu)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論