附录

Makefile 实战

以下分享一个我编写的一个 Makefile。

此 Makefile 的功能是将对应的 .c.cpp 的源代码编译成对应的可执行程序。如 aaa.c 会编译成 aaabbb.cpp 会编译成 bbb。这个 Makefile 可以帮助编写 C 和 C++ 程序的朋友快速编译自己的程序。

此 Makefile 可以用于 MacOS 和 Linux 系统中。

使用方法:

命令
说明
makemake all
编译当前文件夹下所有的 .c.cpp 文件,并调用深层次文件夹内的 Makefile 进行编译
make clean
删除当前文件夹下所有的 .c.cpp 编译后的文件,并调用深层次文件夹内的 Makefile 进行清理

点击当前位置下载此Makefile

#*************************************
# 魏明择的官方网站
# https://weimingze.com
# 创建人  :  魏明择
# 创建日期:  2016年11月1日
# 魏明择版权所有,保留所有权利。
#************************************/

CC          := gcc
CFLAG       := -Wall -g -lpthread
CXX         := g++
CXXFLAG     := -Wall -g
CXXFLAG     += -std=c++11     # for C++ 11 支持
LIBS        := -lpthread

C_SRCS      := $(wildcard *.c)    #搜索所有的.c文件
CPP_SRCS    := $(wildcard *.cpp)  #搜索所有的.cpp文件
CTARGETS    := ${C_SRCS:%.c=%}     #把所有的.c文件转换成文件名的目标文件
CPPTARGETS  := ${CPP_SRCS:%.cpp=%} #把所有的.cpp文件转换成文件名的目标文件

MAKEFILS    := $(wildcard */[mM]akefile) #搜索下一层目录下所有的Makefile文件
SUBDIRS     := $(dir $(MAKEFILS))        #提取出所有的目录

#以下删除XCode编译器留下的.dSYM文件夹
XCODE_DSYM  := ${C_SRCS:%.c=%.dSYM}
XCODE_DSYM  += ${CPP_SRCS:%.cpp=%.dSYM}

all : $(CTARGETS) $(CPPTARGETS)
    @for MYDIR in $(SUBDIRS) ; do make -C $${MYDIR} $@ ; done

% : %.c
    $(CC) -o $@ $< $(CFLAG) $(LIBS)

% : %.cpp
    $(CXX) -o $@ $< $(CXXFLAG) $(LIBS)

clean:
    @for MYDIR in $(SUBDIRS) ; do make -C $${MYDIR} $@ ; done
    rm -f $(CTARGETS) $(CPPTARGETS)
    rm -rf $(XCODE_DSYM)

缺点:

此 Makefile 只能对单个的源代码程序编译生成单独的应用程序。不能将多个 .c.cpp 合并成一个 应用程序。

练习:

编写一个 Makefile,可以将此文件夹内的所有 .c.cpp 文件编译并链接称为一个应用程序,应用程序名可以叫做 myapp 或者使用当前文件夹的名称作为应用程序名。