序
linux下的c/c++編譯代碼通常需要自己寫用于本程式的makefile檔案,而事先準備好一個通常的、符合自己編程習慣的模板是可以加快你的編譯作業,
在我看來,一個通常模板應,應具備幾個必要的功能:
- 自動匹配依賴
- 添加目標和依賴的搜索路徑
- 允許多目標編譯
- 可生成庫檔案
- c程式和c++程式編譯快速切換
模板
#-----------------------------1---------------------------
CC = g++ CFLAGS = -Wall -O2 -g CXXFLAGS = -Wall -O2 -g INCLUDES = -I/usr/local/sqlite/include \ -I/usr/local/cgic/include LDFLAGS = -L/usr/local/sqlite/lib -lsqlite3 \ -L/usr/local/cgic/lib -lcgic MAKETMPF = .make_temporary
VPATH = $(HOME):./
#-----------------------------2--------------------------- ifeq ($(CC),gcc) OBJS = $(patsubst %.c,$(MAKETMPF)/%.o,$(wildcard *.c)) else OBJS = $(patsubst %.cc,$(MAKETMPF)/%.o,$(wildcard *.cc)) endif
#-----------------------------3--------------------------- $(shell if [ ! -d $(MAKETMPF) ]; then mkdir $(MAKETMPF); fi;) vpath %.d $(MAKETMPF) vpath %.o $(MAKETMPF) #-----------------------------4--------------------------- TARGETS = systemmain.cgi homepagemain.cgi systemmain_objs = $(MAKETMPF)/systemmain.o homepagemain_objs = $(MAKETMPF)/homepagemain.o
#-----------------------------5--------------------------- all : $(TARGETS) systemmain.cgi : $(systemmain_objs) $(CC) -o $@ $^ $(LDFLAGS) homepagemain.cgi : $(homepagemain_objs) $(CC) -o $@ $^ $(LDFLAGS)
#-----------------------------6--------------------------- $(MAKETMPF)/%.o : %.c $(CC) -o $@ -c $< $(CFLAGS) $(INCLUDES) $(MAKETMPF)/%.o : %.cc $(CC) -o $@ -c $< $(CXXFLAGS) $(INCLUDES)
#-----------------------------7--------------------------- $(MAKETMPF)/%.d : %.c @set -e; rm -f $@;\ $(CC) -MM $< $(INCLUDES) > $@.$$$$;\ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\ rm -f $@.$$$$ $(MAKETMPF)/%.d : %.cc @set -e; rm -f $@;\ $(CC) -MM $< $(INCLUDES) > $@.$$$$;\ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\ rm -f $@.$$$$ -include $(OBJS:.o=.d)
#-----------------------------8---------------------------
libdemo.a : $(OBJS) ar -rv $@ $^; libdemo.so : $(wildcard *.c) $(CC) -shared -fpic -o $@ $^
#-----------------------------9---------------------------
.PHONY : clean
clean :
-rm -f $(TARGETS) $(MAKETMPF)/*
說明
第一部分:
CC 編譯器名稱
CFLAGS 指定gcc編譯引數
CXXFLAGS 指定g++編譯引數
INCLUDES 指定頭檔案的搜索路徑(-I)
LDFLAGS 指定庫檔案的搜索路徑(-L)、庫名(-l)、運行時動態庫加載路徑(-Wl,-rpath=)
MAKETMPF 編譯程序中產生的中間檔案的保存路徑(.o .d等)
VPATH 這是一個系統變數,指向makefile搜索目標、依賴的額外路徑
第二部分:
條件編譯,根據使用的編譯器型別來區分源檔案型別(.c 或.cc)
第三部分:
生成存放中間檔案的目錄
第四部分:
指定多個編譯目標及每個目標的依賴
第五部分:
各目標編譯規則
第六部分:
源檔案編譯規則(自動匹配)
第七部分:
生成各源檔案的依賴
第八部分:
編譯庫檔案
第九部分:
偽目標(清理)
補充
指定動態庫運行查找路徑的兩種方法
- "-Wl,-rpath=" ---向聯結器直接指定
- 向/etc/ld.so.conf檔案尾添加庫路徑, 執行命令ldconfig生效
顯式指定鏈接靜態庫
- 鏈接引數"-static"宣告優先使用靜態庫
參考
makefile中文手冊 https://www.cnblogs.com/liangxiaxu/archive/2012/07/31/2617384.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/147609.html
標籤:Linux
下一篇:文本編輯工具
