在构建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. Jeff Dean 排序时间计算

    Quicksort (sometimes called partition-exchange sort) https://en.m.wikipedia.org/wiki/Quicksort

  2. 用c++后缀自动机实现最大公共字符串算法,并封装成Python库

    后缀自动机的C++代码转自https://e-maxx.ru/algo/suffix_automata,其余封装为自写. 在C++文件同级目录建立setup.py文件,代码如下: # !/usr/bi ...

  3. 【linux】自动删除7天前的文件

    下面的脚本是删除/home目录下7天前的文件 #!/bin/bash -exec rm -f {} \; 把这个脚本保存在/tmp目录下,命名为:clearfile.sh 加入计划任务 crontab ...

  4. VIM中使用tab键自动完成(vim tab键自动补全 )插件supertab

    supertab.vmb 这个插件好好用, Tab自动补全 http://www.vim.org/scripts/script.php?script_id=1643 安装步骤: 1.下载 supert ...

  5. Java基础教程:多线程基础(3)——阻塞队列

    Java基础教程:多线程基础(3)——阻塞队列 快速开始 引入问题 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 模 ...

  6. graphics基础

  7. 动态IP下群晖搭建DDNS服务

    转载地址:https://www.zimrilink.com/share/dsm_aliddns_server.html 通过阿里云API(php)搭建出DDNS动态域名解析服务器;不同的是本文的方法 ...

  8. javascript基础知识整理(不定时更新)

    1.js中真与假的定义: 真:true,非零数字,非空字符串,非空对象 假:false,数字零,空字符串,空对象(null),undefined 2.使用for循环对json进行循环操作 for(va ...

  9. About ListView

    这一篇整理一些ListView的基本知识. PartA翻译自API Guide: (A)API Guide 使用Adapter建立(bind)Layout 当layout内容是动态的或者不是预先决定好 ...

  10. asterisk ss7 ${CALLERID(rdnis)}变量为空问题

    asterisk 1.8.16+chan_ss7 version 2.1.1b ${CALLERID(rdnis)}变量取不到信息问题,解决 编辑 funcs/func_callerid.c chan ...