zoukankan      html  css  js  c++  java
  • Linux开发工具之Makefile(下)

    二、Makefile(下)
    01.make常用内嵌函数
    函数调用
      $(function arguments)
    $(wildcard PATTERN)
      当前目录下匹配模式的文件
      例如:src=$(wildcard *.c)
    $(patsubst PATTERN,REPLACEMENT,TEXT)
      模式替换函数
      例如:$(patsubst %.c,%.o,$src)
      等价于$(src:.c=.o)
    shell函数
      执行色狼来了命令
      例如:$(shell ls -d */)
    #ls
    Makefile
    02.多级目录Makefile
    #touch main.c
    #mkdir bll(应用逻辑层)
    #mkdir ui(界面层)
    #mkdir dal(数据逻辑层)
    #cd ui
    #touch ui.h ui.c
    #cd ..
    #cd dll
    #touch dal.h dal.c
    #cd ..
    #cd bll
    #touch bll.h bll.c
    #ls
    bll dll Makefile ui
    #vi Makefile (有二级目录)
    CC = gcc
    CFLAGS =-Wall -g
    BIN = main
    SUBDIR = $(shell ls -d */)(当前目录下的所有文件夹)
    ROOTSRC = $(wildcard *.c)(当前目录下的所有*.c文件)
    ROOTOBJ = $(ROOTSRC:%.c=%.o)
    SUBSRC = $(shell find $(SUBDIR) -name '*.c')
    SUBOBJ = $(SUBSRC:%.c=%.o)
    $(BIN):$(ROOTOBJ) $(SUBOBJ)
    $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
    .c.o:
    $(CC) $(CFLAGS) -o $< -o $@
    clean:
    rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
    #ls -d */(列出该目录下的文件夹都列出来)
    #find bll dll ui -name '*.c'
    bll/bll.c
    dll/dll.c
    ui/ui.c
    #make
    #makeclean
    #ls
    03.Makefile可能生成多个可执行文件,如何只生成一个可执行文件
    #vi Makefile
    SUBDIRS = test1 test2
    .PHONYL:default all clean $(SUBDIRS)
    default:all
    all clean:
    $(MAKE) $(SUBDIRS) TARGET=$@
    $(SUBDIRS):
    $(MAKE) -C $@ $(TARGET)
    #cd . ./test1
    #vi Makefile
    CC = gcc
    BIN = test1
    OBJS = test1.o
    .PHONY: all clean print
    all:print $(BIN)
    print @echo "----make all in $(PWD)----"
    $(BIN):$(OBJS)
    $(CC) $(OBJS) -o $@
    %.o:%.c
    $(CC) $(OBJS) -o $@
    %.o:%.c
    $(CC) -c $<
    clean:
    @echo "---- make clean in $(PWD) ----"
    rm -f $(BIN) $(OBJS)
    #cd ../test2
    #ls
    #vi Makefile
    CXX = g++(实现C++的编译)
    BIN = test2
    OBJS = test2.o
    CPPFLAGS=-Wall -g
    .PHONY: all clean print
    all:print $(BIN)
    @echo "---- make all in $(PWD) ----"
    $(BIN):$(OBJS)
    $(CXX) $(OBJS) -o $@
    .o:%.cpp
    $(CXX) -c $<
    clean:
    @echo "---- make clean in $(PWD) ----"
    rm -f $(BIN) $(OBJS)
    如果子目录下存在文件夹,也可以采用与顶层目录的Makefile类似的写法
    ,实现多级目录,可扩展的方法。
  • 相关阅读:
    POJ 2955 Brackets 区间DP
    POJ 3311 Hie with the Pie 最短路+状压DP
    POJ 3615 Cow Hurdles(最短路径flyod)
    hdu 3790 最短路径dijkstra(多重权值)
    poj 3254 Corn Fields 状压DP
    状压DP
    poj2411 Mondriaan's Dream 状压DP
    M: Mysterious Conch 字符串哈希
    哈希(hash)理解
    域渗透:GPP(Group Policy Preferences)漏洞
  • 原文地址:https://www.cnblogs.com/baiyifan/p/5279229.html
Copyright © 2011-2022 走看看