makefile的知识点应该很多,看网上的很多教程就能看出来,长的可以写一本书。记录一下自己用的一个简单的makefile,
方便以后查找。
先看一下程序的目录结构:
[root@localhost Exception]# tree ../Exception/ ../Exception/ ├── build ├── include │ └── exception.h ├── lib ├── Makefile ├── src │ ├── exception.cpp │ └── Makefile └── test ├── exception_test.cpp └── Makefile
我们现在要做的是,通过Exception目录下的Makefile控制src和test下的Makefile,将src目录下的程序编译成静态库放到lib目录下,由test目录下程序调用该静态库,
生成可执行文件放入build目录下。
下面看一下我们需要的三个Makefile是怎么写的
Exception/Makefile: all: @echo "build start..." cd src && $(MAKE) TARGET_AR=1 #这里TARGET_AR等于任何值都可以,等于0,‘abc’都行,重要的是它被定义了 cd test && $(MAKE) TARGET_APP=1 #$(MAKE)不用自己定义,默认就是make @echo "---done!!!---" clean: cd src && $(MAKE) clean TARGET_AR=1 cd test && $(MAKE) clean TARGET_APP=1 ------------------------------------------------------------ Exception/src/Makefile: APP_NAME := libexception ifdef TARGET_AR #这里不能写成ifdef $(TARGET_AR) TARGET := ../lib/$(APP_NAME).a endif ifdef TARGET_APP #如果需要编译成动态库,可以加一个ifdef TARGET_SO,在里面加一些动态库选项 TARGET := ../lib/$(APP_NAME) endif CC := g++ LINUX_AR := ar SRCS := $(wildcard *.cpp) OBJS := $(patsubst %.cpp,%.o,$(SRCS)) CFLAGS := -Wall -g INCPATH := -I../include LIBPATH := -lstdc++ -lm -lc all:$(TARGET) ifdef TARGET_AR $(TARGET):$(OBJS) $(LINUX_AR) -r $(TARGET) $(OBJS) endif $(OBJS):$(SRCS) $(CC) $(CFLAGS) $(INCPATH) -c $^ -o $@ clean: rm -rf $(OBJS) rm -rf $(TARGET) ------------------------------------------------------------- Exception/test/Makefile: APP_NAME := test ifdef TARGET_APP TARGET := ../build/$(APP_NAME) endif ifdef TARGET_AR TARGET := ../build/$(APP_NAME).ar endif CC := g++ SRCS := $(wildcard *.cpp) OBJS := $(patsubst %.cpp,%.o,$(SRCS)) CFLAGS := -Wall -g LFLAGS := -lexception LIBPATH := -L../lib INCPATH := -I ../include all:$(TARGET) ifdef TARGET_APP $(TARGET):$(OBJS) $(CC) -o $(TARGET) $(OBJS) $(LFLAGS) $(LIBPATH) endif $(OBJS):$(SRCS) $(CC) $(CFLAGS) $(INCPATH) -c $^ -o $@ clean: rm -rf $(OBJS) rm -rf $(TARGET)
有几点得说明一下:
1.wilecard,patsubst的含义。
在Makefile中给变量赋值时,使用wildcard后,类似于 * 的通配符就可以起作用了。
$(wildcard *.cpp)就表示所有的.cpp文件
$(patsubst %.cpp,%.o,$(SRCS))作用是将$(SRCS)中的所有.cpp后缀替换成.o
2. * 和 % 是不同的
$(wildcard *.cpp)得到所有.cpp文件,$(wildcard %.cpp)什么都得不到
看下面的例子:
abc=$(patsubst %.cpp,%.o,abc.cpp)
all:
    echo $(abc)
输出是abc.o
abc=$(patsubst *.cpp,*.o,abc.cpp)
all:
    echo $(abc)
输出是abc.cpp
从上面的例子应该可以看出*和%的区别,*是通配符号,%是用来进行模式匹配的,搞混了很麻烦
3.$^, $@
$@匹配所有的当前目标文件,$^匹配所有的当前依赖文件,$^像一支箭,射向$@的靶心,这样可能
比较容易记。
以上应该是我知道的所有的关于Makefile的知识了,比较浅显,可能会有错误。要是想简单的系统的了解下Makefile,
推荐看一下这篇文章:http://www.ruanyifeng.com/blog/2015/02/make.html
                    
                

                
            
        
浙公网安备 33010602011771号