• <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>
            隨筆-159  評論-223  文章-30  trackbacks-0
            原理
               在linux平臺下編譯由多個源碼文件或目錄組成的項(xiàng)目工程時(shí),需要編寫make腳本即Makefile文件來編譯,當(dāng)項(xiàng)目工程寵大時(shí),這種方式比單純地使用gcc命令行方便快捷,且易于維護(hù)。由于具體工程的源碼文件數(shù)量的多少及名稱的不同,因此編寫一個較為通用的Makefile文件,來實(shí)現(xiàn)編譯各種不同的工程,具有重要的參考意義和價(jià)值。本文展示了通用Makefile.in文件及其應(yīng)用示例。Makefile.in文件,顧名思義,內(nèi)部實(shí)現(xiàn)用的,應(yīng)由外部具體的Makefile文件提供具體的命令行參數(shù)來調(diào)用,它包括exe,static,share三個規(guī)則目標(biāo),因此支持可執(zhí)行文件、動態(tài)庫和靜態(tài)庫三種工程的編譯,而每種工程又支持debug和release兩種版本,默認(rèn)為release版本,在編譯時(shí)會自動創(chuàng)建debug或release目錄來存放所有中間文件*.o和*.d。在其腳本源碼中,詳見下面實(shí)現(xiàn),小寫變量為內(nèi)部所有,大寫變量為make命令行提供的參數(shù),目前支持以下幾種命令行參數(shù):
                 1)輸出名稱:OUT_NAME,對于庫工程,內(nèi)部自動添加lib前綴
                 2)輸出路徑:OUT_PATH,
            末尾反斜杠/可有可無
                 3)源碼路徑:SRC_PATH, 末尾反斜杠/可有可無
                 4)依賴動態(tài)庫路徑:SHARE_PATH,不帶庫名稱的路徑, 末尾反斜杠/可有可無 
                 5)依賴動態(tài)庫名稱:SHARE_LIB,不帶庫路徑的名稱,內(nèi)部自動添加-l前綴
                 6)依賴靜態(tài)庫路徑:STATIC_PATH,不帶庫名稱的路徑,
            尾反斜杠/可有可無
                 7)依賴靜態(tài)庫路徑:STATIC_LIB,不帶庫路徑的名稱
                 8)預(yù)定義宏:MACROS,內(nèi)部自動添加-D前綴
                 9)編譯模式:MODE,表示編譯成debug或release版本
                 關(guān)于頭文件包含的支持,這里沒有提供命令行參數(shù),在內(nèi)部它固定為SRC_PATH、/usr/include和/usr/local/include三個路徑,對于大多數(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è)有兩個源碼子目錄netcomm和server,前者為動態(tài)庫netcomm工程,后者為主程序server工程,它依賴netcomm庫,每個目錄下都有其自己的Makefile,這個用于編譯單個模塊或主程序,它們的父目錄為src,在這個目錄下有兩個Makefile文件,一個是Makefile.in,這個就是上面講到的通用內(nèi)部Makefile;另一個是Makefile,這個用來聯(lián)編所有的模塊和主程序。
               先來看下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下測試通過。
            posted on 2012-08-16 19:29 春秋十二月 閱讀(3513) 評論(3)  編輯 收藏 引用 所屬分類: System
            丰满少妇人妻久久久久久| 久久久久国产一级毛片高清版| 久久国产亚洲精品无码| 欧美亚洲国产精品久久| 久久夜色精品国产亚洲av| 久久久噜噜噜久久中文字幕色伊伊| 少妇精品久久久一区二区三区| 漂亮人妻被中出中文字幕久久| 久久精品无码一区二区三区日韩| 欧美一区二区精品久久| 东京热TOKYO综合久久精品 | 97精品伊人久久大香线蕉| 看全色黄大色大片免费久久久| 久久艹国产| 久久精品国产亚洲AV蜜臀色欲| 国产精品久久久香蕉| 久久久久久精品免费免费自慰| 午夜天堂av天堂久久久| 亚洲国产欧洲综合997久久| 国产精品国色综合久久| 久久综合九色综合精品| 久久久久久久国产免费看| 囯产极品美女高潮无套久久久| 久久久久亚洲AV无码网站| 狠狠色丁香久久婷婷综合五月| 精品久久人人妻人人做精品| 久久久久香蕉视频| 亚洲精品高清国产一线久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久精品国产亚洲精品2020| 亚洲成人精品久久| 一本久久a久久精品综合香蕉| 久久人人爽人人爽人人片AV不| 国产精品九九九久久九九| 一日本道伊人久久综合影| 青草国产精品久久久久久| 999久久久国产精品| 一本色道久久88—综合亚洲精品| 精品一区二区久久久久久久网站| 久久亚洲AV无码精品色午夜| 欧美精品一区二区精品久久 |