###makefile

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

#@author:       gr
#@date:         2014-07-20
#@email:        [email protected]

一、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 $<
    
  4. 缺省规则,这个规则表示所有的 .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. 变量的高级用法

  8. 第一种是变量值的替换。其格式是$(var:a=b)或是${var:a=b},其意思是,把变量var中所有以“a”字串“结尾”的“a”替换成“b”字串。

    foo=main.o h1.o h2.o
    #$(foo)中所有以“.o”字串结尾全部替换成“.c”
    $new=$(foo:.o=.c)
    #$(bar)的值就是“a.c b.c c.c”。
    
  9. 第二种是把变量的值再当成变量.

    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

你可能感兴趣的:(makefile)