青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-163  評(píng)論-223  文章-30  trackbacks-0
原理
   在linux平臺(tái)下編譯由多個(gè)源碼文件或目錄組成的項(xiàng)目工程時(shí),需要編寫make腳本即Makefile文件來(lái)編譯,當(dāng)項(xiàng)目工程寵大時(shí),這種方式比單純地使用gcc命令行方便快捷,且易于維護(hù)。由于具體工程的源碼文件數(shù)量的多少及名稱的不同,因此編寫一個(gè)較為通用的Makefile文件,來(lái)實(shí)現(xiàn)編譯各種不同的工程,具有重要的參考意義和價(jià)值。本文展示了通用Makefile.in文件及其應(yīng)用示例。Makefile.in文件,顧名思義,內(nèi)部實(shí)現(xiàn)用的,應(yīng)由外部具體的Makefile文件提供具體的命令行參數(shù)來(lái)調(diào)用,它包括exe,static,share三個(gè)規(guī)則目標(biāo),因此支持可執(zhí)行文件、動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)三種工程的編譯,而每種工程又支持debug和release兩種版本,默認(rèn)為release版本,在編譯時(shí)會(huì)自動(dòng)創(chuàng)建debug或release目錄來(lái)存放所有中間文件*.o和*.d。在其腳本源碼中,詳見下面實(shí)現(xiàn),小寫變量為內(nèi)部所有,大寫變量為make命令行提供的參數(shù),目前支持以下幾種命令行參數(shù):
     1)輸出名稱:OUT_NAME,對(duì)于庫(kù)工程,內(nèi)部自動(dòng)添加lib前綴
     2)輸出路徑:OUT_PATH,
末尾反斜杠/可有可無(wú)
     3)源碼路徑:SRC_PATH, 末尾反斜杠/可有可無(wú)
     4)依賴動(dòng)態(tài)庫(kù)路徑:SHARE_PATH,不帶庫(kù)名稱的路徑, 末尾反斜杠/可有可無(wú) 
     5)依賴動(dòng)態(tài)庫(kù)名稱:SHARE_LIB,不帶庫(kù)路徑的名稱,內(nèi)部自動(dòng)添加-l前綴
     6)依賴靜態(tài)庫(kù)路徑:STATIC_PATH,不帶庫(kù)名稱的路徑,
尾反斜杠/可有可無(wú)
     7)依賴靜態(tài)庫(kù)路徑:STATIC_LIB,不帶庫(kù)路徑的名稱
     8)預(yù)定義宏:MACROS,內(nèi)部自動(dòng)添加-D前綴
     9)編譯模式:MODE,表示編譯成debug或release版本
     關(guān)于頭文件包含的支持,這里沒(méi)有提供命令行參數(shù),在內(nèi)部它固定為SRC_PATH、/usr/include和/usr/local/include三個(gè)路徑,對(duì)于大多數(shù)的工程,應(yīng)該夠用了。

實(shí)現(xiàn)
 1#Makefile.in
 2
 3inc_path := $(SRC_PATH) /usr/include /usr/local/include
 4inc_path := $(addprefix -I,$(inc_path))
 5override SHARE_PATH += /usr/lib /usr/local/lib
 6override SHARE_PATH  := $(addprefix -L,$(SHARE_PATH))
 7override SHARE_LIB  := $(if $(SHARE_LIB),$(addprefix -l,$(SHARE_LIB)))
 8override STATIC_PATH := $(patsubst %/,%,$(STATIC_PATH)) 
 9override STATIC_LIB := $(if $(STATIC_PATH),$(if $(STATIC_LIB),$(addprefix $(STATIC_PATH)/,$(STATIC_LIB))))
10override SRC_PATH := $(patsubst %/,%,$(SRC_PATH))
11override MACROS := $(addprefix -D,$(MACROS))
12
13cxxflags := -Wall $(MACROS)
14
15ifeq ($(MODE),debug)
16  cxxflags += -
17  tmp_path := $(SRC_PATH)/debug
18else
19  cxxflags += -O2 -DNDEBUG 
20  tmp_path := $(SRC_PATH)/release
21endif
22
23lib_name := $(addprefix lib,$(OUT_NAME))
24
25srcs := $(wildcard $(SRC_PATH)/*.c) $(wildcard $(SRC_PATH)/*.cpp)
26deps := $(patsubst %.c,%.d,$(patsubst %.cpp,%.d,$(srcs)))
27deps := $(foreach dep,$(deps),$(notdir $(dep)))
28deps := $(addprefix $(tmp_path)/,$(deps))
29
30objs := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(srcs)))
31objs := $(foreach obj,$(objs),$(notdir $(obj)))
32objs := $(addprefix $(tmp_path)/,$(objs))
33
34share_name  := $(tmp_path)/$(lib_name).so
35static_name := $(tmp_path)/$(lib_name).a
36exe_name    := $(tmp_path)/$(OUT_NAME)
37    
38override MACROS := $(if $(MACROS),$(addprefix -D,$(MACROS)))
39
40.PHONY: exe lib static share clean config
41
42arflags    := -rc
43
44definMKDIR
45if [ ! -d $(tmp_path) ]; then \
46mkdir $(tmp_path);\
47fi 
48endef
49
50config:
51    @$(MKDIR)
52
53exe: config $(exe_name)
54
55lib: config static share
56
57static: $(static_name)
58    
59share: $(share_name)
60
61$(exe_name): $(objs) 
62    @echo "Linking to execute ($@ : $(objs))."
63    $(CXX) -o $@ $(objs) $(SHARE_PATH) $(SHARE_LIB) $(STATIC_LIB)
64    @cp $(exe_name) $(OUT_PATH) 
65        
66$(static_name): $(objs)
67    @echo "Archive to static library ($@ [$(objs)])."
68    $(AR) $(arflags) $@ $(objs)
69    @cp $(static_name) $(OUT_PATH) 
70    
71$(share_name): $(objs)
72    @echo "Linking to shared library ($@ [$(objs)])."
73    $(CXX) $(cxxflags) -o $@ $(objs) -fPIC -shared
74    @cp $(share_name) $(OUT_PATH) 
75    
76$(tmp_path)/%.o: $(SRC_PATH)/%.cpp $(tmp_path)/%.d
77    @echo "Compile $@ ($<)."
78    $(CXX) $(cxxflags) $(inc_path) -c $< -o $@
79
80$(tmp_path)/%.d: $(SRC_PATH)/%.cpp 
81    @echo "Compile $@ ($<)."
82    $(CXX) $(cxxflags) -MM $< -o $@.$$$$; \
83    sed 's,\($*\)\.o[ :]*,\1.o $@:, g' < $@.$$$$ > $@; \
84    rm -f $@.$$$$
85
86-include $(deps)
87
88clean:
89    $(RM) $(objs) $(deps) $(share_name) $(static_name) $(exe_name)

應(yīng)用
   這里假設(shè)有兩個(gè)源碼子目錄netcomm和server,前者為動(dòng)態(tài)庫(kù)netcomm工程,后者為主程序server工程,它依賴netcomm庫(kù),每個(gè)目錄下都有其自己的Makefile,這個(gè)用于編譯單個(gè)模塊或主程序,它們的父目錄為src,在這個(gè)目錄下有兩個(gè)Makefile文件,一個(gè)是Makefile.in,這個(gè)就是上面講到的通用內(nèi)部Makefile;另一個(gè)是Makefile,這個(gè)用來(lái)聯(lián)編所有的模塊和主程序。
   先來(lái)看下netcomm的Makefile文件內(nèi)容,如下所示
 1path := SRC_PATH=. OUT_PATH=../../output
 2
 3.PHONY: all debug release clean
 4
 5all: debug release 
 6    
 7debug:
 8    $(MAKE) -../Makefile.in lib MODE=debug OUT_NAME=netcommd $(path)
 9
10release:
11    $(MAKE) -../Makefile.in lib MODE=release OUT_NAME=netcomm $(path)
12
13clean:
14    $(MAKE) -../Makefile.in clean MODE=debug OUT_NAME=netcommd $(path)
15    $(MAKE) -../Makefile.in clean MODE=release OUT_NAME=netcomm $(path)
     
   再看下server的Makefile文件內(nèi)容,如下所示   
 1macros := MACROS="_USE_MEM_POOL=1"
 2
 3path := SRC_PATH=. OUT_PATH=../../output SHARE_PATH=../../output
 4
 5.PHONY: all debug release clean 
 6
 7all: debug release 
 8
 9debug:
10    $(MAKE) -../Makefile.in exe MODE=debug OUT_NAME=serverd SHARE_LIB="netcommd" $(macros) $(path)
11
12release:
13    $(MAKE) -../Makefile.in exe MODE=release OUT_NAME=server SHARE_LIB="netcomm" $(macros) $(path)
14
15clean:
16    $(MAKE) -../Makefile.in clean MODE=debug OUT_NAME=serverd $(path)
17    $(MAKE) -../Makefile.in clean MODE=release OUT_NAME=server $(path)
    
   最后看下src的Makefile文件內(nèi)容,如下所示
 1.PHONY: all release debug clean
 2
 3all: debug release
 4
 5debug:
 6    $(MAKE) debug -C netcomm 
 7    $(MAKE) debug -C server
 8
 9release:
10    $(MAKE) release -C netcomm
11    $(MAKE) release -C server
12
13clean:
14    $(MAKE) clean -C netcomm
15    $(MAKE) clean -C server
   以上所有腳本代碼,在make 3.81下測(cè)試通過(guò)。
posted on 2012-08-16 19:29 春秋十二月 閱讀(3533) 評(píng)論(3)  編輯 收藏 引用 所屬分類: System
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            麻豆乱码国产一区二区三区| 一二三区精品| 一区二区三区国产在线观看| 亚洲一区二区三区在线观看视频| 今天的高清视频免费播放成人| 亚洲字幕在线观看| 一区二区三区欧美激情| 午夜免费久久久久| 欧美一区二区三区在线观看视频| 欧美男人的天堂| 99国产精品| 99re6热在线精品视频播放速度| 亚洲午夜精品一区二区三区他趣| 亚洲精品免费在线| 卡一卡二国产精品| 亚洲福利视频专区| 在线免费观看日韩欧美| 久久久精品一区二区三区| 欧美一区二区在线免费播放| 欧美午夜宅男影院| 亚洲欧美日韩一区二区三区在线观看| 一本久久a久久精品亚洲| 欧美在线视频全部完| 久久久久久久久久久一区| 国产欧美va欧美va香蕉在| 午夜日韩av| 久久九九久久九九| 欧美体内谢she精2性欧美| 亚洲少妇自拍| 亚洲欧美在线x视频| 国产一区二区三区黄视频| 欧美一级片在线播放| 欧美精品在线观看播放| 亚洲欧洲日本mm| 欧美精品成人一区二区在线观看 | 亚洲无吗在线| 欧美四级在线观看| 欧美成人蜜桃| 欧美福利小视频| 国产一区亚洲| 亚洲午夜久久久久久久久电影网| 蜜臀va亚洲va欧美va天堂| 亚洲国产日韩欧美| 久久久91精品国产一区二区三区| 欧美国产亚洲精品久久久8v| 国产精品久久久久久久午夜 | 欧美三日本三级少妇三99| 国产亚洲视频在线观看| 亚洲欧美日本精品| 亚洲国产成人高清精品| 亚洲精品精选| 欧美高清一区| 极品少妇一区二区三区| 久久久99久久精品女同性| 日韩视频在线免费| 欧美精品亚洲二区| 亚洲高清一二三区| 久久久噜噜噜| 亚洲一区网站| 欧美午夜在线视频| 一本色道久久综合亚洲精品小说 | 久久精品一二三| 国产精品美女在线观看| 亚洲主播在线观看| 最新国产乱人伦偷精品免费网站| 快播亚洲色图| 激情亚洲网站| 久久噜噜亚洲综合| 久久天天躁夜夜躁狠狠躁2022 | 久久久久久亚洲精品杨幂换脸 | 午夜在线一区| 欧美在线日韩在线| 久久久久九九视频| 国产在线麻豆精品观看| 蜜臀av国产精品久久久久| 亚洲欧美区自拍先锋| 欧美1区2区视频| 久久久天天操| 欧美四级在线| 亚洲欧美国内爽妇网| 欧美激情一区二区三区在线视频| 美女性感视频久久久| 日韩亚洲国产欧美| 国产精品欧美日韩| 香蕉久久精品日日躁夜夜躁| 亚洲精品资源美女情侣酒店| 久久久亚洲影院你懂的| 国产一区二区日韩精品| 性色av一区二区三区红粉影视| 欧美伊人久久| 精品91视频| 乱人伦精品视频在线观看| 免费在线看一区| 亚洲第一在线| 欧美系列一区| 亚洲一区二区三区四区视频 | 欧美高清日韩| 亚洲国产日韩精品| 久久riav二区三区| 欧美激情1区2区| 亚洲精品乱码久久久久久按摩观| 久久免费一区| 欧美高清视频一区二区三区在线观看| 欧美亚一区二区| 欧美另类专区| 久久久亚洲人| 中日韩男男gay无套| 欧美成人亚洲| 久久久久一本一区二区青青蜜月| 欧美精品乱人伦久久久久久| 久久久久久黄| 香蕉久久一区二区不卡无毒影院| 亚洲电影免费观看高清完整版在线观看| 亚洲人成网站777色婷婷| 国产精品视频99| 欧美激情aaaa| 久久久青草青青国产亚洲免观| 99精品国产高清一区二区| 久久免费的精品国产v∧| 国产免费成人av| 亚洲第一黄网| 亚洲欧美日韩精品久久亚洲区 | 久久久久国产精品一区三寸| 亚洲丶国产丶欧美一区二区三区| 久久精品国产亚洲a| 亚洲人成在线影院| 亚洲愉拍自拍另类高清精品| 午夜在线电影亚洲一区| 亚洲欧美变态国产另类| 亚洲影音先锋| 亚洲色诱最新| 欧美在线一二三区| 亚洲男人的天堂在线观看| 亚洲国产成人av好男人在线观看| 久久精品国产久精国产爱| 亚洲视频碰碰| 欧美在线免费观看| 亚洲精品久久| 久久精品国亚洲| 久久深夜福利| 欧美日韩直播| 欧美色视频一区| 国产区精品视频| 男女激情久久| 亚洲资源av| 欧美视频二区36p| 一区二区三区视频观看| 欧美国产日本| 久久网站免费| 国产三区二区一区久久| 韩国精品一区二区三区| 亚洲愉拍自拍另类高清精品| 欧美一进一出视频| 欧美国产三级| 欧美成人午夜激情在线| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美日本精品在线| 伊人色综合久久天天| 久久福利一区| 久久精品国产99国产精品澳门| 国产精品久久9| 久久精品免费| 久久久久久国产精品mv| 禁久久精品乱码| 欧美激情网站在线观看| 噜噜噜噜噜久久久久久91| 亚洲国产经典视频| 亚洲日韩欧美视频一区| 欧美日本一道本| 欧美在线亚洲综合一区| 久久综合久久综合九色| 亚洲视频一起| 久久免费高清| 亚洲一级在线观看| 久久成人免费网| 中国亚洲黄色| 欧美好吊妞视频| 久久综合九色| 国产日本亚洲高清| 亚洲免费av网站| 亚洲女人天堂成人av在线| 国产一区二区0| 亚洲精品日韩在线观看| 狠狠色综合一区二区| 一区二区欧美日韩视频| 亚洲免费大片| 午夜精品久久久久久久99樱桃| 最新国产成人av网站网址麻豆| 久久亚洲精品一区| 99精品国产99久久久久久福利| 欧美一区视频| 99精品国产99久久久久久福利| 国产精品久久中文| 新狼窝色av性久久久久久| 久久久久久9| 亚洲一区二区伦理| 91久久午夜| 狠狠色丁香久久婷婷综合_中| 欧美精品videossex性护士| 久久国产精品网站|