• Makefile学习(三)[第二版]


    make常用内嵌函数

    1、函数调用

       $(function arguments) #$引用的结果就是函数生成的结果

     

    2、Makefile下常用的函数

    1)$(wildcard PATTERN) #匹配当前目录下的文件

    例如:src=$(wildcard *.c) #匹配当前目录下所有的.c文件

     

    2)$(patsubst PATTERN,REPLACEMENT,TEXT) #模式替换函数

    例如:$(patsubst %.c,%.o,$src) #等价于$(src:%.c=%.o)[常用]

     

    3)shell函数,执行shell命令

    例如:$(shell ls –d */)

     

    多级目录Makefile

    #示例1-所有的编译均由主目录下的Makefile完成


    CC = gcc   

    CFLAGS   = -Wall -g

     

    BIN      = main  

     

    SUBDIR   = $(shell ls -d */) #SUBDIR保存了当前目录下的子目录

    ROOTSRC  = $(wildcard *.c) #ROOTSRC保存了当前目录下的.c文件

    ROOTOBJ  = $(ROOTSRC:%.c=%.o) #ROOTOBJ保存了将ROOTSRC中.c替换为.o文件之后的结果

     

    SUBSRC   = $(shell find $(SUBDIR) -name '*.c') #SUBSRC保存了所有子目录下的所有.c文件

    SUBOBJ   = $(SUBSRC:%.c=%.o) #SUBOBJ保存了将SUBSRC中.c替换为.o文件之后的结果

     

    $(BIN):$(ROOTOBJ) $(SUBOBJ)

            $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)

     

    %.o:%.c

            $(CC) $(CFLAGS) -c $< -o $@ #将所有的.c生成.o文件

     

    clean:

            rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)

     

     



    #示例2-各个子目录下都有想对应的Makefile文件,各个子目录负责相应的编译工作

     

    DIRS = lib intro sockets advio daemons datafiles db environ 

        fileio filedir ipc1 ipc2 proc pty relation signals standards 

        stdio termios threadctl threads printer exercises

     

    all:

        for i in $(DIRS); do 

            (cd $$i && echo "making $$i" && $(MAKE) ) || exit 1; 

        done

     

    clean:

        for i in $(DIRS); do 

            (cd $$i && echo "cleaning $$i" && $(MAKE) clean) || exit 1; 

    done

     

    生成分布在多个目录下的可执行文件

    #每个子目录都需要生成一个可执行文件,当前目录的结构如下图


    #各个文件的内容如下

     

    //test1/test1.c
    #include <stdio.h>
    
    int main()
    {
        printf("Hello !
    ");
        return 0;
    }

    #test1/Makefile 

    .PHONY: all clean print

     

    CC = gcc 

    CFLAGS = -Wall -g

     

    BIN = test1

    SOURCES = $(wildcard *.c)

    OBJECTS = $(SOURCES:%.c=%.o)

     

    all: print $(BIN)

    print:

        @echo "----- make all in $(PWD) -----"

     

    $(BIN): $(OBJECTS)

        $(CC) $(CFLAGS) -o $@ $^

     

    #$(OBJECTS): $(SOURCES)

    %.o: %.c 

        $(CC) $(CFLAGS) -o $@ -c $<

     

    clean:

        @echo "---- make clean in $(PWD) -----"

        -rm -rf $(BIN) $(OBJECTS)


    //test2/test2.cpp
    #include <iostream>
    using namespace std;
    
    int main(void)
    {
        cout << "World!" << endl;
    }

    #test2/Makefile

    .PHONY: clean all print

     

    CXX = g++ 

    CPPFLAGS = -Wall -g

     

    BIN = test2

    SOURCES = $(wildcard *.cpp)

    OBJECTS = $(SOURCES:.cpp=.o)

     

    all: print $(BIN)

     

    print:

        @echo "----- make all in $(PWD) -----"

     

    $(BIN): $(OBJECTS)

        $(CXX) $(CPPFLAGS) -o $@ $<

     

    %.o: %.cpp  #可以省略该行以及下面一行

        $(CXX) $(CPPFLAGS) -o $@ -c $<

     

    clean:

        @echo "----- make clean in $(PWD) -----"

        -rm -rf $(BIN) $(OBJECTS)



    #Makefile-在主目录下

    SUBDIR = $(shell /bin/ls -d */)

     

    .PHONY: default all clean $(SUBDIR)

     

    default: all 

     

    all clean:

        $(MAKE) $(SUBDIR) TARGET=$@

     

    $(SUBDIR):

        $(MAKE) -C $@ $(TARGET)


    #执行make之后的结果

     

     

    #执行后的目录结构图


    增添了好多文件[.o 和 可执行文件]

     

    #执行make clean的结果

     

     

    #执行之后的结构图


    恢复原样O(∩_∩)O~



  • 相关阅读:
    R并行计算
    VMware虚拟机安装linux系统
    爬虫资料
    R-shiny服务器安装及配置
    数模国赛——致病基因
    vs 2013远程调试
    获取url的hash值
    JavaScript调试技巧之console.log()详解
    无法打开登录所请求的数据库
    location.host 与 location.hostname 的区别
  • 原文地址:https://www.cnblogs.com/itrena/p/5927012.html
Copyright © 2020-2023  润新知