Linux学习笔记——例说makefile 综合案例
生活随笔
收集整理的這篇文章主要介紹了
Linux学习笔记——例说makefile 综合案例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
0.前言 從學(xué)習(xí)C語(yǔ)言開始就慢慢開始接觸makefile,查閱了非常多的makefile的資料但總感覺沒有真正掌握makefile,假設(shè)自己動(dòng)手寫一個(gè)makefile總認(rèn)為非常吃力。所以特意借助博客總結(jié)makefile的相關(guān)知識(shí),通過樣例說明makefile的詳細(xì)使用方法。 例說makefile分為下面幾個(gè)部分,很多其它內(nèi)容請(qǐng)參考【例說makefile索引博文】 ? ? 1.僅僅有單個(gè)C文件? ? 2.含有多個(gè)C文件? ?? 3.須要包含頭文件路徑 4.添加宏定義 5.添加系統(tǒng)共享庫(kù) 6.添加自己定義共享庫(kù) 7.一個(gè)實(shí)際的樣例
【代碼倉(cāng)庫(kù)】——makefile-example 代碼倉(cāng)庫(kù)位于bitbucket,可借助TortoiseHg(GUI工具)克隆代碼或者在網(wǎng)頁(yè)中直接下載zip包。 【本例說明】
本例借助開源項(xiàng)目freemodbus展開來分析makefile的詳細(xì)使用方法,freemodbus包含多個(gè)平臺(tái)的移植分支,本例主要從linuxTCP入手。
1.makefile文件 請(qǐng)?zhí)鎿Q當(dāng)中的[tab]。并以代碼倉(cāng)庫(kù)中的makefile文件為主。 # 指定編譯器 CC = gcc# CFLAG包含頭文件文件夾 CFLAGS = -g -Wall# 頭文件查找路徑 INC = -Iport -I../../modbus/rtu \-I../../modbus/ascii -I../../modbus/include -I../../modbus/tcp# 靜態(tài)鏈接庫(kù) LDFLAGS = LDLIBS = -lpthread # 目標(biāo) TARGET = tcpmodbus # 源文件 SRC = demo.c port/portother.c \port/portevent.c port/porttcp.c \../../modbus/mb.c ../../modbus/tcp/mbtcp.c \../../modbus/functions/mbfunccoils.c \../../modbus/functions/mbfuncdiag.c \../../modbus/functions/mbfuncholding.c \../../modbus/functions/mbfuncinput.c \../../modbus/functions/mbfuncother.c \../../modbus/functions/mbfuncdisc.c \../../modbus/functions/mbutils.c# 源文件編譯為目標(biāo)文件 OBJS = $(SRC:.c=.o)# 鏈接為可運(yùn)行文件 $(TARGET): $(OBJS) [tab]$(CC) $^ -o $@ $(LDFLAGS) $(LDLIBS)# 清除可運(yùn)行文件和目標(biāo)文件 clean: [tab]rm -f $(OBJS) [tab]rm -f $(TARGET)# 編譯規(guī)則 增加頭文件 $@代表目標(biāo)文件 $< 代表第一個(gè)依賴文件 %.o:%.c [tab]$(CC) $(CFLAGS) $(INC) -o $@ -c $<
2.詳細(xì)說明 【1】freemodbus中的文件較多,INC包含全部的頭文件查找路徑,路徑使用前綴-I表示,請(qǐng)注意若路徑較多時(shí)通過"\"實(shí)現(xiàn)續(xù)行。 【2】此處使用了共享庫(kù)pthread,共享庫(kù)的設(shè)備一般包含兩個(gè)方面。第一,共享庫(kù)的名稱 DLIBS。共享庫(kù)的查找路徑LDFLAGS。因?yàn)閜thread為系統(tǒng)共享庫(kù),使用了系統(tǒng)默認(rèn)的查找路徑 /usr/lib,所以LDFLAGS設(shè)置能夠省略,若須要制定共享庫(kù)文件夾,在文件夾前增加-L就可以。 【3】$(CC) $^ -o $@?$(LDFLAGS) $(LDLIBS)?和共享庫(kù)設(shè)置有關(guān)的參數(shù)須要放在鏈接指令中。
3.運(yùn)行過程 make clean && make ? ? 【控制臺(tái)輸出】 輸出內(nèi)容較多。此處省略。
? ? 【執(zhí)行】 sudo ./tcpmodbus Type 'q' for quit or 'h' for help! > h FreeModbus demo application help:'d' ... disable protocol stack.'e' ... enabled the protocol stack's' ... show current status'q' ... quit applicationr'h' ... this information >
? ? 【說明】 【1】編譯時(shí)增加了頭文件查找路徑。 【2】鏈接時(shí)增加了共享庫(kù)。
4.總結(jié) 【1】LDIBS指定共享庫(kù)。共享庫(kù)以 -l 為前綴。 【2】LDFLAGS指定共享庫(kù)查找路徑。路徑以 -L 為前綴。
【代碼倉(cāng)庫(kù)】——makefile-example 代碼倉(cāng)庫(kù)位于bitbucket,可借助TortoiseHg(GUI工具)克隆代碼或者在網(wǎng)頁(yè)中直接下載zip包。 【本例說明】
本例借助開源項(xiàng)目freemodbus展開來分析makefile的詳細(xì)使用方法,freemodbus包含多個(gè)平臺(tái)的移植分支,本例主要從linuxTCP入手。
本文將不會(huì)闡述freemodbus的詳細(xì)使用方法,而是以makefile的使用方法為主。
1.makefile文件 請(qǐng)?zhí)鎿Q當(dāng)中的[tab]。并以代碼倉(cāng)庫(kù)中的makefile文件為主。 # 指定編譯器 CC = gcc# CFLAG包含頭文件文件夾 CFLAGS = -g -Wall# 頭文件查找路徑 INC = -Iport -I../../modbus/rtu \-I../../modbus/ascii -I../../modbus/include -I../../modbus/tcp# 靜態(tài)鏈接庫(kù) LDFLAGS = LDLIBS = -lpthread # 目標(biāo) TARGET = tcpmodbus # 源文件 SRC = demo.c port/portother.c \port/portevent.c port/porttcp.c \../../modbus/mb.c ../../modbus/tcp/mbtcp.c \../../modbus/functions/mbfunccoils.c \../../modbus/functions/mbfuncdiag.c \../../modbus/functions/mbfuncholding.c \../../modbus/functions/mbfuncinput.c \../../modbus/functions/mbfuncother.c \../../modbus/functions/mbfuncdisc.c \../../modbus/functions/mbutils.c# 源文件編譯為目標(biāo)文件 OBJS = $(SRC:.c=.o)# 鏈接為可運(yùn)行文件 $(TARGET): $(OBJS) [tab]$(CC) $^ -o $@ $(LDFLAGS) $(LDLIBS)# 清除可運(yùn)行文件和目標(biāo)文件 clean: [tab]rm -f $(OBJS) [tab]rm -f $(TARGET)# 編譯規(guī)則 增加頭文件 $@代表目標(biāo)文件 $< 代表第一個(gè)依賴文件 %.o:%.c [tab]$(CC) $(CFLAGS) $(INC) -o $@ -c $<
2.詳細(xì)說明 【1】freemodbus中的文件較多,INC包含全部的頭文件查找路徑,路徑使用前綴-I表示,請(qǐng)注意若路徑較多時(shí)通過"\"實(shí)現(xiàn)續(xù)行。 【2】此處使用了共享庫(kù)pthread,共享庫(kù)的設(shè)備一般包含兩個(gè)方面。第一,共享庫(kù)的名稱 DLIBS。共享庫(kù)的查找路徑LDFLAGS。因?yàn)閜thread為系統(tǒng)共享庫(kù),使用了系統(tǒng)默認(rèn)的查找路徑 /usr/lib,所以LDFLAGS設(shè)置能夠省略,若須要制定共享庫(kù)文件夾,在文件夾前增加-L就可以。 【3】$(CC) $^ -o $@?$(LDFLAGS) $(LDLIBS)?和共享庫(kù)設(shè)置有關(guān)的參數(shù)須要放在鏈接指令中。
請(qǐng)注意共享庫(kù)應(yīng)該插入鏈接過程中而不是編譯過程。
3.運(yùn)行過程 make clean && make ? ? 【控制臺(tái)輸出】 輸出內(nèi)容較多。此處省略。
? ? 【執(zhí)行】 sudo ./tcpmodbus Type 'q' for quit or 'h' for help! > h FreeModbus demo application help:'d' ... disable protocol stack.'e' ... enabled the protocol stack's' ... show current status'q' ... quit applicationr'h' ... this information >
? ? 【說明】 【1】編譯時(shí)增加了頭文件查找路徑。 【2】鏈接時(shí)增加了共享庫(kù)。
4.總結(jié) 【1】LDIBS指定共享庫(kù)。共享庫(kù)以 -l 為前綴。 【2】LDFLAGS指定共享庫(kù)查找路徑。路徑以 -L 為前綴。
總結(jié)
以上是生活随笔為你收集整理的Linux学习笔记——例说makefile 综合案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Laravel API记录
- 下一篇: tab选项卡在鼠标经过时实现切换延迟