Makefile编写方法小结
目录
1.基本写法
2. 带上clean
3. 加上特殊字符、通配符等进行简写
4. 避免重复的进一步简化
5. 加入编程思想的工程通用模板
1.基本写法
Makefile的编写方便了在linux下编译大型的C/C++的程序,同时,Makefile的写法相对灵活,我们从最简单的方法入手。最简单的方式其实就是原始的gcc或者g++的语法,但是要明确makefile最最基本的语法规则。
Target … : prerequisites …
Command1
Command2
…
这个格式必须使用,即
编译的目标,冒号,编译目标的依赖
执行的操作
下面我们简单写一个main函数,其调用了加法和减法器中的函数。具体如下:
这里实现很简单,重点是理清楚逻辑依赖关系。一共存在5个文件,main.cpp, add.cpp, add.h, minus.cpp, minus.h。
具体的写法如所示,这个简单的makefile已经可以运行,要注意的要点是:
这里的目标是生成可执行的名称为main的文件,其依赖编译形成的main.o, add.o, minus.o这三个文件, 如果makefile都能够找到这三个依赖文件,那么就执行下面的执行命令。g++将几个.o文件链接成可执行文件main。类似的,在任何涉及更多文件的工程中,makefile中的第一行应该将所有需要用到的.o文件都写上,不管是直接的依赖还是间接的依赖。
在缺省目标之外,还有其他三个目标,即缺省目标的三个依赖。这三个目标也写明了其对应的依赖和执行命令。其实makefile文件的编写关键之一就是要写明依赖。
2. 带上clean
通过上面的方法,可以达到生成可执行文件的目的了。但是这个过程会生成很多中间过程的对象文件,如add.o这样的文件。在所有过程执行完成之后,我们很可能不想保留这些文件,甚至不想保留最后的可执行文件,只保留所有的源文件。这里就可以使用一个新的目标,通常命名为clean,通过rm命令来删除这些不想保留的文件。执行时可以用make命令指定要执行的目标,就可以不执行缺省的目标。如make clean。
需要注意的是,这里clean的写法依然保持1中基本写法模式,目标是clean,没有依赖,执行删除的相应命令。
这里还有一个.PHONY: clean的用法,实际上是防止目录中真的有一个没有依赖的clean文件,但是一般情况下是不这样写的。
3. 加上特殊字符、通配符等进行简写
其实makefile的写法相当的灵活,这里简单介绍两个符号,可以达到简化的目的。$^和$@。$^表示当前规则中的所有依赖条件。$@表示当前规则中的目标。所以上面的makefile文件可以写成如下的形式。
另外除了缺省目标外,其他的目标也都是中间过程,这里涉及到隐藏规则的技巧。但是其实也不需要明白隐藏技巧到底是什么,只需要记住makefile重要的是依赖关系。将除了缺省目标之外的其他目标,只写明其依赖的头文件即可,不需要写其本身的源文件和执行命令。重点还是依赖关系。
4. 避免重复的进一步简化
以上是熟悉makefile的编写过程,实际上真实工程中的makefile不会写成上面那样。首先,在makefile中写出依赖的头文件是不太明智的。第一是我们实际上在规范的源文件中书写中,都会用#include写明依赖的头文件名称。而且真实情况下,这种头文件会非常的多。所以第一步是依赖并不写成.o文件(对象文件)和.h文件(头文件)之间的,而是写成.o文件和.cpp文件(源文件)的。在规范的代码写法中,通常一个源文件对应生成一个对象文件。第二,如果我们不在源文件中写明头文件,而在makefile中写,也是可以的。但是这会造成一个问题,就是我们需要再makefile中明确各种复杂的头文件依赖,并且如果在源文件中有#include依赖,那么就会造成重复。这种属于手工维护重复的行为不止在写程序中,在很多工程应用问题上都需要避免。会产生这边改了,那边没有同步的情况。比如数据库里就极力避免这种数据。我们希望的是修改一个地方,所有需要用到该处的内容就都修改了。
那么可以写成如下的形式。
5. 加入编程思想的工程通用模板
写程序的一个经典思维就是模板化,模板化的好处是方便根据具体情况进行局部的改动,而大部分内容可以通用。Makefile也不例外,由于每个程序都需要经过编译的过程,所以makefile是典型的需要反复使用的文档。另外根据上面改进写法,很多.o和.cpp之间的依赖是同一个格式,很容易用通配符之类的符号来代替。于是可以写成如下的形式。这里除了下图中的注释解释,还有一个单独的“$”符号没有解释,这个符号非常的常见,其实意思很简单,就是将后面括号里的变量展开。比如$(TARGET)展开后就是要形成的目标文件——main。
在这种写法下,makefile文件不拘泥于某个特定的工程,具有较强的适用性。而且很多东西可以局部修改,比如编译器,头文件的路径,生成可执行文件的路径等。具体的解释在语句后的注释,使用起来较为方便。
Makefile编写方法小结相关推荐
- makefile编写知识小结
1.Makefile中的宏定义 -D 增加编译宏定义:-I增加头文件搜索路径: 示例:CFLAGS+=-D __CUSTOMER_CODE__, 则编译时,只编译__CUSTOMER_CODE__宏定 ...
- static使用方法小结
static使用方法小结 statickeyword是C, C++中都存在的keyword, 它主要有三种使用方式, 当中前两种仅仅指在C语言中使用, 第三种在C++中使用(C,C++中详细细微操作不 ...
- linux环境cpp/c文件的makefile编写(caffe举例)
编译单个cpp文件 方法一.g++ 文件名.cpp,生成一个名为 "文件名.out" 的可执行文件 方法二.g++ -c 文件名.cpp -o 新文件名.o:生成一个被命名成 &q ...
- linux 生成和使用动态链接库和静态链接库的Makefile编写
引用 Jesse Rei 的 linux 生成和使用动态链接库和静态链接库的Makefile编写 生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接 ...
- Linux软件安装方法小结
Linux软件安装方法小结(附:rpm详解) 在使用Linux系统的过程中,软件包的安装是避免不了的,在Linux下,软件安装程序的种类很多,安装方法也各式各样,(舒适性自然比不上windows :- ...
- 一文入门USB设备的驱动编写方法
摘要:本文介绍了USB设备驱动相关的基本知识结构,和编写驱动的基本步骤和流程.最后通过编写一个USB鼠标的驱动实力,讲述了简单字符型USB输入设备驱动的具体编写步骤,并给予了测试方法.文末附有完整程序 ...
- Linux下的makefile编写 ——陈皓《跟我一起写Makefile》学习笔记(一)
Linux下的makefile编写 前言 本人记笔记习惯使用OneNote,在学习LinuxC++过程中发现deepin上没有大佬开发或者移植,本人技术也不精,所以决定写博客记笔记(只是习惯问题,并没 ...
- 网站禁用鼠标右键php代码,JavaScript_网页禁用右键菜单和鼠标拖动选择方法小结,一、禁止鼠标右键菜单:- phpStudy...
网页禁用右键菜单和鼠标拖动选择方法小结 一.禁止鼠标右键菜单: 有如下两种方法来禁止鼠标右键 1.在HTML元素的Body标签中加入Javascript事件句柄,代码如下: 说明:您也可以在网页指定的 ...
- 有关利用PL2303HX USB到RS232 TTL转换器适配器模块把STC89C52RC等STC系列单片机与计算机连接、向Keil添加STC库及hex文件考录方法小结
有关利用PL2303HX USB到RS232 TTL转换器适配器模块把STC89C52RC等STC系列单片机与计算机连接.向Keil添加STC库及hex文件考录方法小结 PL2303HX转换器适配器模 ...
最新文章
- 计算机浙大网java网站,网络课程—非计算机专业JAVA程序设计语言
- 电脑打印机共享,打印机共享
- nyoj 287(区间覆盖)
- vue可视化拖拽生成工具_vdesjs: 基于vue的可视化拖拽,代码生成工具。提升前端开发效率,或者集成至项目作为在线拖拽工具。(持续迭代升级中)...
- 04.elasticsearch_get操作
- 检测到磁盘可能为uefi引导_在本地硬盘安装WinPE系统,实现UEFI引导,摆脱U盘
- 口红机源码运营版对接CC支付源码
- u盘在磁盘管理可以显示 但是电脑中找不到_U盘无法识别怎么办?试试这种方法,没准还有救!...
- fzu 2204 7 dp
- Vue3中文文档 - vuejs
- php 度分秒和小数转化
- 邮递员问题java实现_中国邮递员问题算法.PPT
- 通过后台控制浏览器对文件下载
- 计算机cmp代表什么意思,CMP是什么
- python买卖股票_Python实现买卖股票的最佳时机的一种方法
- linux切割日志方法,Linux下nginx生成日志自动切割的实现方法
- 3月第一周总结(3.1~3.7)
- 关于已上架APP下架的正确方式
- Linux之基础命令
- 线程让步yield实现