版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基金從業(yè)資格測試題模擬測試題及答案
- 2025年河北省安全員B證考試題庫附答案
- 永修縣保安考試題及答案
- SAP(中國)校招面試題及答案
- 大專財經(jīng)考試題目及答案
- 未來五年輸入設(shè)備背光模組企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年新形勢下少兒讀物類雜志出版服務(wù)行業(yè)順勢崛起戰(zhàn)略制定與實施分析研究報告
- 2026黑龍江哈爾濱市香坊第二小學(xué)校招聘體育教師1人參考題庫必考題
- 關(guān)于公開考調(diào)政協(xié)青川縣委員會宣教中心工作人員的考試備考題庫必考題
- 四川農(nóng)業(yè)大學(xué)合同制聘用人員招聘參考題庫附答案
- 2026年江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試模擬測試卷必考題
- 外事工作培訓(xùn)
- 2026年中藥材生產(chǎn)質(zhì)量管理規(guī)范理論考試題含答案
- 北京市東城區(qū)2025-2026年高三上期末地理試卷(含答案)
- 鎮(zhèn)海區(qū)國資系統(tǒng)招聘筆試題庫2026
- 2025至2030中國高壓套管行業(yè)調(diào)研及市場前景預(yù)測評估報告
- 2026秋招:國家電投面試題及答案
- 智能機(jī)械與機(jī)器人全套課件
- 《2025年CSCO前列腺癌診療指南》更新要點解讀
- 膿毒癥診斷與治療臨床規(guī)范指南(2025年版)
- 國有企業(yè)財務(wù)管理制度
評論
0/150
提交評論