目录

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编写方法小结相关推荐

  1. makefile编写知识小结

    1.Makefile中的宏定义 -D 增加编译宏定义:-I增加头文件搜索路径: 示例:CFLAGS+=-D __CUSTOMER_CODE__, 则编译时,只编译__CUSTOMER_CODE__宏定 ...

  2. static使用方法小结

    static使用方法小结 statickeyword是C, C++中都存在的keyword, 它主要有三种使用方式, 当中前两种仅仅指在C语言中使用, 第三种在C++中使用(C,C++中详细细微操作不 ...

  3. linux环境cpp/c文件的makefile编写(caffe举例)

    编译单个cpp文件 方法一.g++ 文件名.cpp,生成一个名为 "文件名.out" 的可执行文件 方法二.g++ -c 文件名.cpp -o 新文件名.o:生成一个被命名成 &q ...

  4. linux 生成和使用动态链接库和静态链接库的Makefile编写

    引用 Jesse Rei 的 linux 生成和使用动态链接库和静态链接库的Makefile编写 生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接 ...

  5. Linux软件安装方法小结

    Linux软件安装方法小结(附:rpm详解) 在使用Linux系统的过程中,软件包的安装是避免不了的,在Linux下,软件安装程序的种类很多,安装方法也各式各样,(舒适性自然比不上windows :- ...

  6. 一文入门USB设备的驱动编写方法

    摘要:本文介绍了USB设备驱动相关的基本知识结构,和编写驱动的基本步骤和流程.最后通过编写一个USB鼠标的驱动实力,讲述了简单字符型USB输入设备驱动的具体编写步骤,并给予了测试方法.文末附有完整程序 ...

  7. Linux下的makefile编写 ——陈皓《跟我一起写Makefile》学习笔记(一)

    Linux下的makefile编写 前言 本人记笔记习惯使用OneNote,在学习LinuxC++过程中发现deepin上没有大佬开发或者移植,本人技术也不精,所以决定写博客记笔记(只是习惯问题,并没 ...

  8. 网站禁用鼠标右键php代码,JavaScript_网页禁用右键菜单和鼠标拖动选择方法小结,一、禁止鼠标右键菜单:- phpStudy...

    网页禁用右键菜单和鼠标拖动选择方法小结 一.禁止鼠标右键菜单: 有如下两种方法来禁止鼠标右键 1.在HTML元素的Body标签中加入Javascript事件句柄,代码如下: 说明:您也可以在网页指定的 ...

  9. 有关利用PL2303HX USB到RS232 TTL转换器适配器模块把STC89C52RC等STC系列单片机与计算机连接、向Keil添加STC库及hex文件考录方法小结

    有关利用PL2303HX USB到RS232 TTL转换器适配器模块把STC89C52RC等STC系列单片机与计算机连接.向Keil添加STC库及hex文件考录方法小结 PL2303HX转换器适配器模 ...

最新文章

  1. 计算机浙大网java网站,网络课程—非计算机专业JAVA程序设计语言
  2. 电脑打印机共享,打印机共享
  3. nyoj 287(区间覆盖)
  4. vue可视化拖拽生成工具_vdesjs: 基于vue的可视化拖拽,代码生成工具。提升前端开发效率,或者集成至项目作为在线拖拽工具。(持续迭代升级中)...
  5. 04.elasticsearch_get操作
  6. 检测到磁盘可能为uefi引导_在本地硬盘安装WinPE系统,实现UEFI引导,摆脱U盘
  7. 口红机源码运营版对接CC支付源码
  8. u盘在磁盘管理可以显示 但是电脑中找不到_U盘无法识别怎么办?试试这种方法,没准还有救!...
  9. fzu 2204 7 dp
  10. Vue3中文文档 - vuejs
  11. php 度分秒和小数转化
  12. 邮递员问题java实现_中国邮递员问题算法.PPT
  13. 通过后台控制浏览器对文件下载
  14. 计算机cmp代表什么意思,CMP是什么
  15. python买卖股票_Python实现买卖股票的最佳时机的一种方法
  16. linux切割日志方法,Linux下nginx生成日志自动切割的实现方法
  17. 3月第一周总结(3.1~3.7)
  18. 关于已上架APP下架的正确方式
  19. Linux之基础命令
  20. 线程让步yield实现

热门文章

  1. 【转】汽车零件产品开发过程A样件、B样件和C样件的区别?
  2. 【Python】逐步回归
  3. html中背景条纹效果,CSS3 页面滚动交叉斜条纹背景效果
  4. CSS样式相关知识点(一):样式表、选择器、样式属性
  5. Altium Design 如何出带元件的印制板图纸
  6. 001:Mapbox GL加载基础的地图
  7. 实用的程序员面试技巧
  8. 用python绘制一个螺旋正方形
  9. Android端连接ActiveMQ服务器
  10. 使用js获取最快获取到本地ip