一个好用的Makefile模板

一文读懂C++程序的结构、执行与编译 一般来说想要成为C++开发工程师,最先需要了解的不是数据类型等方面的信息,而是C++程序的结构、执行与分析,毕竟知其然知其所以然,才能更长久的发展。 C++程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象-对象具有状态和行为。例如:一只狗的状态-颜色、名称、品种,行为-摇动、叫唤、吃。对象是类的实例。 类-类可以定义为描述对象行为/状态的模板/蓝图。 方法-从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑 阅读详情

一个好用的Makefile模板

1. 概述

Makefile,what??很多windows程序可能都没听说过
简单的说,Makefile是Unix/Linux环境下描述了整个工程的编译、连接等规则的文件,其主要包括三点:
1) 工程中的哪些源文件需要编译以及如何编译
2) 依赖库以及库所在的位置
3) 想得到什么:可执行文件?静态库?动态库?
项目中,我们会有很多源文件、头文件、依赖库文件、配置文件等等,通过Makefile定义规则来制定编译顺序,编译规则,编译依赖,甚至更复杂的功能,将极大的方便我们的开发,其最大的好处就是”自动化编译“,通过‘make’就可以方便的进行整个项目的编译工作。

2. 编译链接

从源码到可执行文件,具体步骤:
源码--->预处理--->编译--->汇编--->链接
我们常常把预处理、编译和汇编三个阶段统称为编译阶段,在这个阶段,编译器会检查程序语法、函数与变量是否声明等。
经过编译之后,unix/linux下,将得到.o文件(一般来说,每个源文件都能生成一个对应的.o文件),即object file(windows下即.obj文件),.o不能直接运行,我们需要将其合成可执行文件,这个过程就叫链接。在链接过程,链接器会在所有的.o文件中找寻函数的实现,如果找不到,则会报链接错误。

3.Makefile规则

Makefile只有一个规则:

target: prerequisites
command

target:即目标,它可以是可执行文件、可以是.o文件,也可以是一个标签,简单的说,它就是你要做的事情。
prerequisites:生成target所需要的条件,它可以是一个文件,也可以是另外一个target
command:具体执行的命令

解释如下:target这个目标依赖于prerequisites中的文件,其生成规则定义在command中。
更简单一点表达:如果prerequisites中任何一个文件的时间要比target文件更新的话,command所定义的命令就会执行。

eg:
=====makefile=====
#第一个规则
test: main.o hello.o
gcc main.o hello.o –o test

#第二个规则
main.o: main.c
gcc –c main.c

#第三个规则
hello.o: hello.c hello.h
gcc –c hello.c

#第四个规则
clean :
rm –rf *.o
rm –rf test
=====makefile=====

第一个规则:
test就是target, main.o和hello.o是prerequisites,'gcc main.o hello.o –o test’是command。
即:要生成test,就需要有main.o和hello.o,如果main.o或者hello.o文件的时间比test新(或者test文件不存在),则会执行命令’gcc main.o hello.o –o test’,

第二个规则:
target是main.o,main.c是prerequisites,’gcc –c main.c’是command
即:要生成test,就需要main.c,如果main.c文件的时间比main.o新,则会执行’gcc –c main.c’

第三个规则和第二个规则类似

第四个规则:
这里,target是clean,此处,clean并不是一个文件,而是一个动作的名字,它的执行,需要显示的在make命令后制定,例如,此处执行‘make clean’,将调用其后的command,即‘rm –rf *.o rm –rf test’,另外,此处没有prerequisites,即任何时候都执行command

我们来看下如果执行'make'会做什么:

1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test”这个文件,并把这个文件作为最终的目标文件。
3、如果test文件不存在,或是test所依赖的后面的[.o]文件的文件修改时间要比test这个文件新,那么,他就会执行后面所定义的命令来生成test这个文件。
4、如果test所依赖的.o文件存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。
5、依次类推,直到生成的所有的target都是最新的。

用户如果执行'make clean',由于其后面没有依赖,则执行command所定义的命令。

如果我们修改了代码main.c,然后执行‘make’,由于main.c时间比main.o新,那么main.o会重新编译生成,由于main.o文件的时间比test新,那么test也会重新生成。

4. 一个好用的Makefile模板

 

######################################################################
# makefile 模版
#
######################################################################

###################项目路径和程序名称#################################
DIR=$(shell pwd)
BIN_DIR=$(DIR)/bin
LIB_DIR=$(DIR)/lib
SRC_DIR=$(DIR)/src
INCLUDE_DIR=$(DIR)/include
OBJ_DIR=$(DIR)/obj
DEPS_DIR=$(DIR)/deps
#PROGRAM=$(BIN_DIR)/test
PROGRAM=$(BIN_DIR)/test

###################OBJ文件及路径############################################
EXTENSION=c
OBJS=$(patsubst $(SRC_DIR)/%.$(EXTENSION), $(OBJ_DIR)/%.o,$(wildcard $(SRC_DIR)/*.$(EXTENSION)))
DEPS=$(patsubst $(OBJ_DIR)/%.o, $(DEPS_DIR)/%.d, $(OBJS))

###################include头文件路径##################################
INCLUDE=\
  -I$(INCLUDE_DIR)
  
###################lib文件及路径######################################

###################编译选项及编译器###################################
CC=gcc
CFLAGS=-Wall -W -g
LDFLAGS=

###################编译目标###########################################
.PHONY: all clean rebuild

all:$(OBJS)
 @echo $(DEPS_DIR)
 $(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS)


$(DEPS_DIR)/%.d: $(SRC_DIR)/%.$(EXTENSION)
 $(CC) -MM $(INCLUDE) $(CFLAGS) $< | sed -e 1's,^,$(OBJ_DIR)/,' > $@

sinclude $(DEPS)

$(OBJ_DIR)/%.o:$(SRC_DIR)/%.$(EXTENSION)
 $(CC) $< -o $@ -c $(CFLAGS) $(INCLUDE)

rebuild: clean all

clean:
 rm -rf $(OBJS) $(LIB_DIR)/lib* $(BIN_DIR)/*

 

工作目录结构:
bin  deps  include  lib  Makefile  obj  src

5. 结语

以上只是Makefile的冰山一角,有兴趣的同学可以看下make的info pages。

Makefile可以很方便的维护中小型项目,但是,在项目大到一定程度,存在众多依赖之后,人力维护Makefile也是一件极为困难的事情。目前有一些自动化的工具,例如Automake,就是一个极好的工具,可参考:http://www.ibm.com/developerworks/cn/linux/l-makefile/。

 


【明道云】如何让用户可以新增但不能修改记录 在设计表单时直接将字段设置只读是不行的。字段设置只读将会直接让界面上此字段的前端组件不可编辑。 阅读详情

相关推荐

物理机centos7系统重启后直接进入dracut

Warning: /dev/centos/root does not exist Warning: /dev/mapper/centos-root does not exist 在shell命令行执行以下: dracut:/# lvm vgscan dracut:/# lvm vgchange -ay dracut:/# exit 之后可以正常进入系统(测试正常)。 但是重启之后依然会进入dracut模式,永久解决如下: 查看kernel文件 [root@ecs ~]# ls -ltrh /boot

魏志标的博客 1万+

C++ : 整体工程构架设计流程

1.一个项目通常分为bin(存放项目生成的dll和整体工程的exe),code(存每个项目的代码),lib(存每个项目生成的lib),pdb(存放项目生成的pdb文件),sln(解决方案)一个主干项目,其他若干依赖的库。以本工程为例,创建一个NewTest主干项目,两个动态库项目ATest、BTest。步骤二:创建A、B动态库项目,创建的位置放在code文件夹下。步骤三:处理A、B、主项目的属性信息。设置pdb的输出位置,在pdb下。步骤一:创建NewTest项目。2.B\主项目依赖设置。

qq_38409301的博客 1362

软件工程导论考试通关秘籍:太原理工大学历年真题解析(附答案)

本文为太原理工大学《软件工程导论》考试提供高效备考指南,通过解析近六年真题,揭示高频考点如软件生命周期、UML建模和结构化设计等核心模块的命题规律。文章提供真题拆解、实战策略和避坑指南,帮助考生掌握图形转换题和简答题的应答技巧,助力考试通关。

weixin_29233333的博客 227

2023-4-4-C++应该怎么设计一个好的项目结构

本人也是一个C++迷,作为一名C++程序员我的目标就是成为一名高级C++架构师,与此同时我会通过不断地学习最终实现我的目标。作为一个幸运儿,我受到身边大佬的影响在编程生涯正式开始的阶段养成了比较良好的编程风格和项目目录的管理。在工作和生活中也接触过Java工程和Python工程,每一个语言都有属于其不同的项目架构,这篇文章主要是探索学习一下一个好的C++的项目架构应该是什么样子的,程序员应该如何去管理项目。欢迎与我同样有兴趣了解C++架构的小伙伴一起学习一下,如果感觉作者写的不错欢迎点赞评论加关注,后续还会

小tom的博客 2050

【WebLogic】Linux图形化界面安装WebLogic 14.1.2.0

Linux系统图形化界面安装WebLogic 14.1.2.0.0版本

cnskylee的博客 837

绕开华为通道,获取解锁码解锁BootLoader

刷机有风险,操作需谨慎,如果因为各种因素导致手机变砖无法开机,本教程概不负责,望悉知 前言 这篇文章的大多内容是根据我自己找的一篇文章《绕开华为通道,获取解锁码解锁BootLoader》来编写的,里面的大部分内容是文章的原内容。下面的都是我参考文章中做了一些小部分的修改,增加了我华为P8手机的一些操作,下面开始讲述我的解锁过程。 因为华为官方在2018年的七八月份吧,关闭了解锁码的申请通道,这...

Martin.Mu `s Special Column 5万+

Makefile,Linux程序员你伤不起

1. 概述 Makefile,what??很多windows程序可能都没听说过简单的说,Makefile是Unix/Linux环境下描述了整个工程的编译、连接等规则的文件,其主要包括三点: 1) 工程中的哪些源文件需要编译以及如何编译 2) 依赖库以及库所在的位置 3) 想得到什么:可执行文件?静态库?动态库? 项目中,我们会有很多源文件、头文件、依赖库文件、配置文件等等,通过Makefile定义...

ruilinruirui 341

手把手实现STM32+ESP8266+原子云服务器+手机APP应用——第一节-ATK-ESP8266 WIFI模块通过USB-TTL实现连接原子云服务器与手机APP互相通信

本节实现ATK-ESP8266 WIFI模块通过USB-TTL实现连接原子云服务器与手机APP通信。具体来说,本节使用串口CH340(USB-TTL)连接正点原子ATK-ESP8266 WIFI模块,通过AT命令实现连接原子云服务器与手机APP互相通信,实现硬件设备(WIFI模块)与云服务器和手机APP的互相通信。后面章节不用串口CH340(USB-TTL),通过编写单片机程序实现数据远程互相通信,并介绍手机APP的程序设计。单片机任意款即可,STM32F1系列,F4系列,H系列等都可以。本系列为(手把手实

嵌入式阿齐Archie 8419

干货:构建C/C++良好的工程结构

C++20通过了一项非常重要的特性:提供import机制。使用import来引用某个导出的库,而不是基于源代码展开的#include来引用头文件,有助于写出更直观的代码,减少编译时间。都9102年了,要知道在很多年前,C#,Java就支持了这个特性,如C#,以Assembly(程序集)的形式来管理模块,而C语言,C++,从诞生开始到现在仍然在用最原始的#include,真是让人头大。 那么,我就...

weixin_44970848的博客 4125

SAP SEGW 事物码里的 Function Import

开放数据协议(OData)包括标准的 CRUD (创建、检索、更新和删除)操作,这些操作映射到 HTTP 方法的 POST、GET、PUT/MERGE 和 Delete 几类。此外,OData还支持进一步的服务操作:,这些操作可以由HTTP方法GET或POST调用,用于处理不能映射到标准 CRUD 操作的任何内容。通过在数据模型中创建 ,可以在 service Builder 中实现此类额外的服务操作。例如,您可以为以下自定义操作创建函数导入:Work Item confirmation检查航班的可用性虽然

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 994

微信公众平台 - 微信内置浏览器 WeixinJSBridge.invoke(‘xxx‘) API 报错:system:access_denied(常见于微信支付、分享朋友圈/转发好友等功能)解决方案

微信支付提示System:access_denied,调用微信支付返回:system:access_denied为什么,安卓版微信支付偶尔出现system:access_denied,微信公众号开发分享出现system:access_denied,system:access_denied如何解决?微信WeixinJSBridge.invoke(‘xxx‘)API调用后出现报错,微信内部H5WeixinJSBridge.invokesystem:access_denied,使用微信jssdk时报ac

🏆 前端领域优质创作者 5145

一个通用Makefile模板

最近学习Makefile,写了一个C++编译的通用Makefile模板 它能做什么: 1. 能编译出应用程序,静态库,动态库 2. 可以用在任意目录结构的工程 3. 可以指定多个源文件后缀 4. 可以指定源文件的排除目录和排除文件列表 5. 已经充分考虑了源文件与头文件的依赖关系 6. 使用简单,只需要修改USER-DEFINED SECTION中的几个参数 执行流程:

2042

图解B+树的插入过程

B+ 树在现代数据库中很常见,如果我们了解它,在工作中可能对性能优化会有更好的帮助! 最近我一直在思考 B+ 树的高度是由什么决定的。知道我了解了 B+ 树的插入过程,才有一种恍然大悟的感觉! 网上的一些资料杂乱无章,不同的数据库可能还有对 B+ 树有不同的实现。但是万变不离其宗,B+ 树的定义,大致如下所示: 总结一下,B+ 树有下面 5 个重要的特点。 B+ 树包含 2 种类型的结点: 内部结点(也称索引结点)和叶子结点。 根结点本身即可以是内部结点,也可以是叶子结点。 根结点的关键字个数最

愿君出走半生,归来时仍是少年 2134

一个实现vcs自动化仿真的makefile模板

文章目录一个实现vcs自动化仿真的makefile模板makefile简单介绍makefile & vcs文件结构makefile文件内容 一个实现vcs自动化仿真的makefile模板 vcs的安装可以参考我另外一篇文章【点这儿】 makefile简单介绍 个人理解就是一种类似脚本的东西。 写一个名字叫Makefile的文件,里面放很多块儿shell命令,为每一块命令分配一个自定义名称(就像打包一样),再把包之间像树状图一样连起来。 这样以来,在终端输入一个简单的自定义名称,Makefile就能帮

Ocean_Yv的博客 5290

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Makefile学习--一个模板以及多makefile联合编译

Makefile学习--通过一个模板以及多makefile联合编译

weixin_46430043的博客 975

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

一个Makefile模板

makefile模板

weixin_40673765的博客 333

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一个适合小型项目的通用Makefile模板

使用规则: 目录结构图如下所示。 phone:为项目名 Make后最后的可执行文件也为phone src : 该目录下存放所有的.c文件 inc : 该目录下存放所有的.h文件#Copyright (c) 2017 xiethon@126.com # # *DOCUMENTATION* # 一个通用的Makefile模板 # $(notdir $(CURDIR)) 获取目录名 TARGET

xiethon的专栏 2403

Makefile的一个模板

#Makefile可以自动推导[.o]文件的依赖,如找到了whatever.o #那么whatever.c就会是whatever.o的依赖文件 #将*.c展开 SRCS = $(wildcard *.c) #对应的.o文件 OBJS = $(SRCS:%.c=%.o) #字符串替换函数 #ALL = $(subst .c,,$(SRCS)) #取前缀函数 #所有的可执行文件 ALL = $(bas

gwq5210的专栏 599

自己调试通过的一个通用makefile模板

这个是从本人的QQ空间转过来的 模板文件夹的下载地址: http://download.youkuaiyun.com/detail/longyue0917/6725889    这个模板是之前公司的一个牛人写的,我这个连门都没入的菜鸟因为没有项目需求,所以一直没有花时间去研究。可惜好景不长,酱油没打几天,就需要我来单挑linux了,网上找了很多模板,都不尽如人意,没办法,只好硬着头

秋水三尺尘不染 7522

一个简易的makefile模板

一个简易的makefile模板

weixin_43320890的博客 280

一个简单的makefile模板

在Linux下编译工程,makefile是必不可少的工具,下面记录一个简单的makefile模板。 多个文件目录下的makefile写法推荐参考博文:http://www.cnblogs.com/Anker/p/3242207.html DIR_SRC = ./ DIR_BIN = ../bin PROGRAMNAME = program TARGET = ${DIR_BIN...

weixin_30583563的博客 144

一个使用多年的Makefile模板

许久以前,一直使用自己总结的Makefile模板,这个模板也是基于现有资料整理而成的。 内容 Makefile完全内容如下: # !!!=== cross compile... CROSS_COMPILE ?= CC = $(CROSS_COMPILE)gcc CXX = $(CROSS_COMPILE)g++ AR = $(CROSS_COMPILE)ar ARFLA...

李迟的专栏 1643

一个很简单的Makefile模板

# 我的一个很简单的Makefile模板 # 每次自己写的一些小程序,都用这个改改,时间长了居然都忘了一些 # 具体的含义,这里就来一个中文完全注释版吧。 CC=gcc ######################################################### # 递归展开式变量: # 缺点1:使用此风格的变量定义,可能会由于出现变量递归定义而导

sgiwxyg的专栏 827

一个通用的Makefile模板-转

使用前需要在当前目录下建立一个obj文件夹,用来存放中间文件。*.d文件中包含了对应*.c的依赖文件,*.o文件为对应*.c文件的目标文件。 详细的Makfile资料可以看看GNU make中文手册和跟我一起写Makefile Makefile通用模板CC=gcc CFLAGS=-Wall OBJPATH=obj                # .d文件和.o文件保存

xp5xp6的博客 462

一个linux下g++使用的 makefile 模板

这个makefile可用于编译大多数的c++工程。 你可以根据需要修改下面的参数: VPATH: 源文件的文件路径。多个文件夹路径用空格分隔 OBJ: 编译目标所需要的.o文件 当然,你也可以不改动此文件,而直接在 make 命令的参数中指定 如: make VPAT

cwchenwu88的专栏 356

一个适用各类场合的Makefile模板

1.写在前面   对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了“一键编译”,编码完成后只需一个操作即可完成编译、链接、生成目标文件。Linux开发与Windows不同,Linux下一般用的的gcc/g++编译器,如果是开发ARM下的Linux程序,还需用到arm-linux-gcc/arm-linux-g++交叉编译器。Linux下也可以实现“一键编译...

只要思想不滑坡,想法总比问题多。 5060
上一篇: Latent Model- NMF
下一篇: Linux下makefile教程
metasearch
博客等级 码龄21年 158粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值