在构建C++的后台服务时,经常需要自己来编写makefile文件,而如果没有合适的方法或模板时,编写makefile文件是一件很费时费力的事情。因此,为了帮助程序员高效准确的编写makefile文件,在此提供一套通用的makefile文件编写框架,基于这个框架,使用者只需要相应的填充选项,就可构建好完整的makefile文件。

首先,以一个简单的示例来展示这个makefile文件框架,如下所示:

#生成的二进制文件名
BINOUT := test
#依赖的动态库或静态库
LIBS := abc sst llt #头文件路径
INCS := ./ \
../common/include \
./include #动态库或静态库文件的相对路径
LIBPATHS := ../../libs \
../libpaths #编译源程序时所使用的宏
USED_MARCOS := _LINUX_OS_ _UNIT_TEST_ #所使用的编译器
GCC = g++
#编译时的参数配置
CFLAGS = -g -Wall -O2 #编译时所依赖的通用c++源程序
COMMONSRCS=$(wildcard ../common/src/*.cpp ../abc/src/*.cpp)
COMMONOBJS=$(patsubst %.cpp,%.o,$(COMMONSRCS)) #源程序文件
SOURCE := $(wildcard ./*.cpp)
OBJS := $(patsubst %.cpp,%.o,$(SOURCE)) all:$(BINOUT) $(BINOUT): $(OBJS) $(COMMONOBJS)
$(GCC) $(CFLAGS) -o $@ $^ $(addprefix -L,$(LIBPATHS)) $(addprefix -l,$(LIBS)) %.o:%.cpp
$(GCC) $(CFLAGS) $(addprefix -D,$(USED_MARCOS)) $(addprefix -I,$(INCS)) -c $< -o $@ clean :
rm -rf $(COMMONOBJS) $(OBJS) $(BINOUT)

这个框架的详细说明可参考以上示例中的注释,主要包含依赖库项、头文件路径项及源程序项,其中源程序项可依据你项目的模块分类构建多个变量来保存编译的目标文件,以上示例仅分成通用目标文件(COMMONOBJS)和目标文件(OBJS)。此外,%.o:%.cpp 这一项就是编译所有依赖的源程序文件为.o的目标文件。在以上模板基础上,通过修改相关选项,就可以完成相应的makefile文件编写。

编译静态库文件:

TARGET = libtest.a
all:$(TARGET) $(TARGET): $(OBJS) $(COMMONOBJS)
rm -f $@
$(AR) rv $@ $^ %.o:%.cpp
$(CC) $(CFLAGS) $(addprefix -D,$(USER_MARCOS)) $(addprefix -I,$(INCS)) -c $< -o $@

编译动态库文件:

TARGET = libtest.so
LIBS :=
INCS :=
LIBPATHS :=
USER_MARCOS := POSIX LINUX CFLAGS = -g -Wall -fPIC
CC = g++
COMMONSRCS=$(wildcard ../common/*.cpp)
COMMONOBJS=$(patsubst %.cpp,%.o,$(COMMONSRCS)) SOURCE := $(wildcard ./*.cpp)
OBJS := $(patsubst %.cpp,%.o,$(SOURCE)) all:$(TARGET) $(TARGET): $(OBJS) $(COMMONOBJS)
rm -f $@
$(CC) -shared -o $@ $^ %.o:%.cpp
$(CC) $(CFLAGS) $(addprefix -D,$(USER_MARCOS)) $(addprefix -I,$(INCS)) -c $< -o $@

一次性编译多个Makefile文件:

all:
make -f Makefile_so clean
make -f Makefile_so all make -f Makefile_a clean
make -f Makefile_a all
clean:
make -f Makefile_so clean
make -f Makefile_a clean

最新文章

  1. [MySQL Reference Manual] 20 分区
  2. Paxos
  3. BIEE 10g 二次开发整理
  4. java Class对象
  5. Verilog学习笔记基本语法篇(九)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 任务和函数
  6. 微课程--Android--Activity组建与Intent
  7. R语言结合概率统计的体系分析---数字特征
  8. Flask 页面缓存逻辑,jinja2 过滤器,测试器
  9. 伟哥对RTO &amp; RPO的通俗理解
  10. 云笔记项目-AOP知识简单学习
  11. Python开发之日志记录模块:logging
  12. GPS获取坐标 显示Google map偏差计算
  13. mysql数据库中,通过mysqladmin工具,创建数据库
  14. datetable dt.select使用詳情
  15. python itertools模块练习
  16. [javase学习笔记]-8.1 statickeyword之特点
  17. Abp Uow 设计
  18. 洛谷八连测R4
  19. 数据结构和算法之单向链表二:获取倒数第K个节点
  20. 【BZOJ4619/3709】[Wf2016]Swap Space/[PA2014]Bohater 贪心

热门文章

  1. Linux C语言 网络编程(二) server模型
  2. mysql服务器启动问题
  3. [2017-12-20]ElasticSearch 小记
  4. PHP的深copy和浅copy
  5. python学习笔记:第五天( 列表、元组)
  6. IDEA 设置忽略那些文件不提交到SVN服务器
  7. Java微信公众平台开发_04_自定义菜单
  8. fiddler篡改请求数据
  9. leetcode 67. Add Binary (高精度加法)
  10. k8s 部署kube-dns