首页 > 技术文章 > ###再探Makefile

gr-nick 2014-07-31 11:23 原文

使用makefile。以前刚开始接触Makefile的时候,写过一个最简单的Makefile点击查看Evernote原文

#@author:       gr
#@date:         2014-07-20
#@email:        forgerui@gmail.com

一、Contents

  1. $@表示目标文件
  2. $^表示依赖文件
  3. $<表示第一个依赖文件
    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 $<
  1. 缺省规则,这个规则表示所有的 .o文件都是依赖与相应的.cpp件的.例如

     .cpp.o:
     g++ -c $<
    

5. `make clean`: `-rm edit $(objects)`前面的`-`表示如果出错不要管,继续后面的操作.`make clean`不要放在第一个,否则会变成默认项.

6. `pkg-config`问题:
    &nbsp;&nbsp;&nbsp;&nbsp;使用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

推荐阅读