zoukankan      html  css  js  c++  java
  • 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~



  • 相关阅读:
    Java连接MySql报错—— com.mysql.cj.exceptions.InvalidConnectionAttributeException
    Java——XML基础知识
    Java——多线程基础知识
    Java——线程安全的集合
    Java——集合
    dom4j——使用dom4j生成xml
    Java——用程序编译一个文件夹下所有java文件到另一个文件夹下
    Java——DOS命令窗口用命令编译文件夹下所有.java文件
    Java——删除Map集合中key-value值
    python 枚举Enum
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6845077.html
Copyright © 2011-2022 走看看