1.根据例子说明,一下是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预编译需要数据库支持的头文件路径。LIBHOME是oracle环境编译需要数据库库文件路径。
2.源文件之间的相互依赖关系。列出需要产生目标文件编译依赖的文件。比如例子中的test目标,其产生时会检测(test.o test1.o test1.o)这些依赖文件的变化,如果依赖文件有变化会自动先编译依赖文件。
3.可执行的命令.即针对目标关系,所作出的编译行为。比如test其检测完依赖文件后执行(cc -o $@ $(CFLAGS) $(LIBS) $^)编译链接产生目标执行文件test.
4.宏使用时用(),{}来确认宏名称例如${LIB}加{}会查找LIB的宏内容,$LIB会查找L的宏内容。
2.2 :常用编译项说明
1. -I:制定头文件搜索的路径
2. -L:连接需要的库文件路径
3. –l:连接需要的库文件(比如:libmylib.so写作 –lmylib)
2.3: 自动化变量说明:
$+ :所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$?:所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚
$^ :所有的依赖文件,以空格分开,不包含重复的依赖文件。
$< :第一个依赖文件的名称。
$@ :目标的完整名称。
$* :不包含扩展名的目标文件名称。
$% :如果目标是归档成员,则该变量表示目标的归档成员名称。
具体对照使用以上makefile,执行make haha得到如下对照信息:
$ make haha
test.o test1.o test1.o
test.o test1.o
test.o test1.o
test.o
haha
2.4:后缀规则:
.SUFFIXES: .sqc .c .o制定新的后缀规则。(%.c:%.sqc),( %.o:%.c)即规则行为。就是将所有.sqc转为.c,.c再转为.o。
.c.o:等价于%.o:%.c
3.注意:
分行符"后面不能再有其他任何内容。
对齐行最好采用^I(tab键)
注释符号#
include包含编译文件
posted on 2009-12-09 13:36
何克勤 阅读(417)
评论(0) 编辑 收藏 所属分类:
GNU Linux/Unix