- #*******************************************************************************
- # File name : Makefile
- # Author : weiming
- # Date : 2012/06/14
- # cmd : make
- #*******************************************************************************
- #编译后可执行程序名称,可根据实际情况修改
- SER_NAME = WM_SER
- M_DATE=`date '+%y%m%d'`
- #编译选项
- CXX = g++
- AR = ar cr
- COMPILE_FLAGS = -Wall -ggdb -fpermissive
- #头文件路径,可根据实际情况增减
- INCLUDE_PATH = -I. -I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/rdbms/public
- #链接库路径,可根据实际情况增减
- #注意ORACLE库路径是否正确
- LIB_PATH = -L. -L$(ORACLE_HOME)/lib
- #链接库,可根据实际情况增减
- LIBS= -lclntsh -lpthread
- #源码文件,当前目录下所有cpp文件
- SRC= $(wildcard *.cpp)
- #中间文件.o
- OBJS=$(SRC:.cpp=.o)
- #Makefile的终极目标all
- all : $(OBJS) $(SER_NAME)
- .PHONY:all clean
- $(SER_NAME):$(OBJS)
- $(CXX) -o $(SER_NAME)_$(M_DATE) $(OBJS) $(INCLUDE_PATH) $(LIB_PATH) $(LIBS)
- %.o : %.cpp
- $(CXX) -c $(COMPILE_FLAGS) $(INCLUDE_PATH) $< -o $@
- clean:
- -rm *.o $(SER_NAME)_$(M_DATE)
- #可根据实际情况修改
- #install
- # ....
makefile相关知识点疑问解答:
1、模式规则示例
下面这个例子表示了,把所有的[.c]文件都编译成[.o]文件.
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
其中,"$@"表示所有的目标的挨个值,"$<"表示了所有依赖目标的挨个值。这些奇怪的变量我们叫"自动化变量",后面会详细
讲述。
2、变量高级用法
这里介绍两种变量的高级使用方法,第一种是变量值的替换。
我们可以替换变量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所有以“a”字
串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。
还是看一个示例吧:
foo := a.o b.o c.o
bar := $(foo:.o=.c)
这个示例中,我们先定义了一个“$(foo)”变量,而第二行的意思是把“$(foo)”中所有以“.o”字串“结尾”全部替换成“.c”,
所以我们的“$(bar)”的值就是“a.c b.c c.c”。
另外一种变量替换的技术是以“静态模式”(参见前面章节)定义的,如:
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
这依赖于被替换字串中的有相同的模式,模式中必须包含一个“%”字符,这个例子同样让$(bar)变量的值为“a.c b.c c.c”。
第二种高级用法是——“把变量的值再当成变量”。先看一个例子:
x = y
y = z
a := $($(x))
在这个例子中,$(x)的值是“y”,所以$($(x))就是$(y),于是$(a)的值就是“z”。(注意,是“x=y”,而不是“x=$(y)”)
我们还可以使用更多的层次:
x = y
y = z
z = u
a := $($($(x)))
这里的$(a)的值是“u”,相关的推导留给读者自己去做吧。
让我们再复杂一点,使用上“在变量定义中使用变量”的第一个方式