在构建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

如何快速编写大项目的Makefile文件的更多相关文章

  1. 自动生成项目的Makefile文件

    自动生成项目的Makefile文件 理论基础 跟我一起写 Makefile:   http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4 ...

  2. 如何组织较大项目的MVC文件夹结构

    现在还用不到,拷贝下来备用,原文链接 2016 年 9 月 第 31 卷,第 9 期 ASP.NET Core - ASP.NET Core MVC 的功能切分 作者 Steve Smith | 20 ...

  3. 编写简单的Makefile文件

    makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c  x.h 表示生成www这个文件需 ...

  4. 如何快速编写Vim语法高亮文件

    这里有一份中文的入门文档,但是太长了,不想读,所以有本文 最快的办法,就是找一个语法相近的语法高亮文件,稍微改一下 自己从头写的话,首先搞定关键字: syntax case match "是 ...

  5. 【阅读笔记】《C程序员 从校园到职场》第六章 配置文件,makefile 文件 (Part 2)

     Contents: 1.配置文件(通常以 ini 结尾) 2.makefile文件 (Linux) PS: 这篇文章的内容,不太理解. 一.配置文件 本文以一个实际的小软件为例,介绍了C语言中配置文 ...

  6. 让你提前认识软件开发(17):makefile文件的书写及应用

    第1部分 又一次认识C语言 makefile文件的书写及应用 [文章摘要] makefile用于Linux下整个project的编译.对于Linux下的C/C++语言的编译是至关重要的. 本文以实际的 ...

  7. 简介make命令和makefile文件

    一.为什么要用到 make 命令和 makefile 文件 在 Linux 下编写一个程序,每次编译都需要在命令行一行一行的敲命令.如果是一个很小的程序还好说,命令不怎的复杂,编译速度也挺快,但是对于 ...

  8. Makefile 文件怎么写

    跟我一起写Makefile:MakeFile介绍 Makefile 使用总结 1. make 命令与 Makefile 文件 在 Linux 平台,执行 make 命令时,会在当前目录下寻找 Make ...

  9. 一个自动管理项目的Makefile(C语言)

    Linux 是所有嵌入式软件工程师绕不过去的坎, makefile 是在Linux系统中绕不过去的坎. 花了几天时间初步学习和了解了makefile 的作用以及功能,并且制作了一个通用型的makefi ...

随机推荐

  1. Java中synchronized

    原文地址 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种:1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用 ...

  2. linux下更改文件夹名

    mv 旧文件夹名 新文件夹名 mv /usr/bin/python_old /usr/bin/python_new

  3. ESP8266串口模块的基本使用【转】

    本文转载自:http://www.shaoguoji.cn/2017/01/15/ESP8266-usage/ ESP8266是一款超低功耗的UART-WiFi 透传模块,拥有业内极富竞争力的封装尺寸 ...

  4. 算法(Algorithms)第4版 练习 1.3.10

    主要思路:和1.3.9相似,只不过运算表达式的生成方式不一样 用Dijkstra的双栈算法. 遇到数字则压入数字栈中(String). 遇到运算符则压入运算符栈中(String). 遇到右括号时,从数 ...

  5. mooc_java Socket

    Socket通信,TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据:基于TCP协议实现网络通信的类客户端的Socket类 服务器端的ServerSocket类 -------------- ...

  6. Java丨springMVC + Ajax 来进行分页

    javaweb 分页技术 实现的方式有很多种,但是小编在网上问了度娘也问了谷老师,得到的答案让小编我不是很满意,so,还是自己写吧! 在小编的博文中,小编不会上传源码,只会把重要的代码和思路供大家参考 ...

  7. L84

    Hospital Noise May Disrupt Patient Improvement Many who need restorative rest the most might not be ...

  8. hdu-5802 Windows 10(贪心)

    题目链接: Windows 10 Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others ...

  9. linux 进程学习笔记-暂停进程

    <!--[if !supportLists]-->Ÿ <!--[endif]-->暂停进程 int pause() 其会挂起当前进程直到有信号来唤醒或者进程被结束. 随便提一下 ...

  10. 运算符-----------instanceof