在构建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. SASL mechanism

    <property> <name>hive.spark.client.rpc.sasl.mechanisms</name> <value>DIGEST- ...

  2. 将众多小文件输入Hadoop的解决方案 可挂载的HDFS

    配置HDFS为可挂载后: 1-可挂载后才支持非完整POSIX语义: 2-仍然不支持随机写入,仍然为“一次写入,多次读取”: 3-可能误用,导致众多小文件: : 1-使用Solr存储和检索小文件: 2- ...

  3. ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

    mysql 删除表时提示有外键 mysql> drop tables auth_group;ERROR 1217 (23000): Cannot delete or update a paren ...

  4. SQL 数据类型 numeric varchar char

    Numeric(10,2) 指字段是数字型,长度为10 小数为两位的 简要描述一下SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型 字符型 VARCHAR VS CHAR VARCHAR ...

  5. hihocoder #1152 Lucky Substrings 【字符串处理问题】strsub()函数+set集合去重

    #1152 : Lucky Substrings时间限制:10000ms单点时限:1000ms内存限制:256MB描述A string s is LUCKY if and only if the nu ...

  6. 如何在Mac的Finder中显示/usr、/tmp、/var等隐藏目录

    原文链接: http://blog.csdn.net/yhawaii/article/details/7435918 Finder中默认是不显示/usr./tmp./var等隐藏目录的,通过在终端中输 ...

  7. leetcode 23. Merge k Sorted Lists(堆||分治法)

    Merge k sorted linked lists and return it as one sorted list. 题意:把k个已经排好序的链表整合到一个链表中,并且这个链表是排了序的. 题解 ...

  8. aoj 0033 玉

    図のように二股に分かれている容器があります.1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし.左の筒 B か右の筒 C に玉を入れます.板 D は支点 E を中心に左右 ...

  9. September Challenge 2017

    Little Chef and Sums 分析:水题,去维护一下前缀和以及后缀和就好,注意long long #include "iostream" #include " ...

  10. 洛谷【P3437】[POI2006]TET-Tetris 3D

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 浅谈标记永久化:https://www.cnblogs.com/AKMer/p/1013 ...