#@author: gr
#@date: 2014-07-20
#@email: [email protected]
一、Contents
$@
表示目标文件$^
表示依赖文件$<
表示第一个依赖文件
main: main.o h1.o h2.o
gcc -o main main.o h1.o h2.o
#上面可以简化为如下
gcc -o $@ $^
#-------------------------------#
main.o: main.c h1.h h2.h
#编译命令可以简写为
gcc -c $<
缺省规则,这个规则表示所有的 .o文件都是依赖与相应的.cpp件的.例如
.cpp.o:
g++ -c $<
5. `make clean`: `-rm edit $(objects)`前面的`-`表示如果出错不要管,继续后面的操作.`make clean`不要放在第一个,否则会变成默认项.
6. `pkg-config`问题:
使用pkg-config可以检索系统中安装*库文件*的信息。-–cflags 参数可以给出在编译时所需要的选项,而 -–libs 参数可以给出连接时的选项。
gcc -c pkg-config –-cflags glib-2.0
sample.c
7. 变量的高级用法
+ 第一种是变量值的**替换**。其格式是`$(var:a=b)`或是`${var:a=b}`,其意思是,把变量`var`中所有以“a”字串“结尾”的“a”替换成“b”字串。
```bash
foo=main.o h1.o h2.o
#$(foo)中所有以“.o”字串结尾全部替换成“.c”
$new=$(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)
)
二、最后学习得到的最后结果。
#file start
CC=g++
CFLAGS=`pkg-config --cflags opencv`
LFLAGS=`pkg-config --libs opencv`
SOURCES=main.cpp stl.cpp non-member.cpp
OBJECTS=$(SOURCES:.cpp=.o)
RUN=stlDemo
all: $(RUN)
depend:
$(CC) $(CFLAGS) -MM $(SOURCES) > .deps
clean:
-rm -rf $(RUN) $(OBJECTS)
$(RUN): $(OBJECTS)
$(CC) -o $@ $^ $(LFLAGS)
.cpp.o:
$(CC) -c $< $(CFLAGS)
include .deps
#file end