1.根據(jù)例子說明,一下是linux下oracle10的程序編譯簡單的makefile文件
CC=cc -g
PROC=proc
CFLAGS=-DPRECOMP -I$(ORACLE_HOME)/precomp/public "
-I$(ORACLE_HOME)/xdk/include -I.
FLAGS= -D_ALL_SOURCE=1 -D_LINUX -g -I../../incl -D_GNU_SOURCE -D_IS_EAB=1 -D__USE_GNU=1 -D__GCC_296 -I/usr/include/libxml2 -I../csrc -I../../csrc/ -DPOSIX=1 -DLINUX
LIBHOME=$(ORACLE_HOME)/lib
LLIBSQL= `cat $(LIBHOME)/sysliblist` "
`cat $(LIBHOME)/ldflags` "
-lclntsh
LIBS= -L$(LIBHOME) $(LLIBSQL) -lmylib
.SUFFIXES: .sqc .c .o
%.c:%.sqc
$(PROC) $(PROCPLSFLAGS) iname=$^ hold_cursor=yes
%.o:%.c
$(CC) -c $(FLAGS) $(LIBS) $^
test:test.o test1.o test1.o
cc -o $@ $(FLAGS) $(LIBS) $^
rm -rf $^
haha:test.o test1.o test1.o
@echo "+="$+
@echo "?="$?
@echo "^="$^
@echo "<="$<
@echo "@="$@
@echo "*="$*
@echo "%="$%
|
2.說明
2.1一般makefile編寫有3個步驟
1.宏定義。主要功能是定義一些宏變量已替代較長的編譯支持信息。一般情況下針對編譯所需要得.h頭文件,.a/.so的庫文件路徑。比如例子中的CFLAGS是oracle預編譯需要數(shù)據(jù)庫支持的頭文件路徑。LIBHOME是oracle環(huán)境編譯需要數(shù)據(jù)庫庫文件路徑。
2.源文件之間的相互依賴關系。列出需要產(chǎn)生目標文件編譯依賴的文件。比如例子中的test目標,其產(chǎn)生時會檢測(test.o test1.o test1.o)這些依賴文件的變化,如果依賴文件有變化會自動先編譯依賴文件。
3.可執(zhí)行的命令.即針對目標關系,所作出的編譯行為。比如test其檢測完依賴文件后執(zhí)行(cc -o $@ $(CFLAGS) $(LIBS) $^)編譯鏈接產(chǎn)生目標執(zhí)行文件test.
4.宏使用時用(),{}來確認宏名稱例如${LIB}加{}會查找LIB的宏內(nèi)容,$LIB會查找L的宏內(nèi)容。
2.2 :常用編譯項說明
1. -I:制定頭文件搜索的路徑
2. -L:連接需要的庫文件路徑
3. –l:連接需要的庫文件(比如:libmylib.so寫作 –lmylib)
2.3: 自動化變量說明:
$+ :所有的依賴文件,以空格分開,并以出現(xiàn)的先后為序,可能包含重復的依賴文件。
$?:所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創(chuàng)建日期晚
$^ :所有的依賴文件,以空格分開,不包含重復的依賴文件。
$< :第一個依賴文件的名稱。
$@ :目標的完整名稱。
$* :不包含擴展名的目標文件名稱。
$% :如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱。
具體對照使用以上makefile,執(zhí)行make haha得到如下對照信息:
$ make haha
test.o test1.o test1.o
test.o test1.o
test.o test1.o
test.o
haha
2.4:后綴規(guī)則:
.SUFFIXES: .sqc .c .o制定新的后綴規(guī)則。(%.c:%.sqc),( %.o:%.c)即規(guī)則行為。就是將所有.sqc轉(zhuǎn)為.c,.c再轉(zhuǎn)為.o。
.c.o:等價于%.o:%.c
3.注意:
分行符"后面不能再有其他任何內(nèi)容。
對齊行最好采用^I(tab鍵)
注釋符號#
include包含編譯文件
posted on 2009-12-09 13:36
何克勤 閱讀(419)
評論(0) 編輯 收藏 所屬分類:
GNU Linux/Unix