`
omygege
  • 浏览: 1386735 次
文章分类
社区版块
存档分类
最新评论

实战Makefile

 
阅读更多

1. 没有makefile的日子

1.1 手动编译

1.2 文件编译依赖树

2. 快速体验makefile

3. makefile 变量

4. makefile条件编译

5. makefile函数

6. 参考资料

<1>. 没有makefile的日子

1.1 程序是如何编译的?

如果存在这么一个工程目录结构:

.
|-- foo.c
|-- foo.h
|-- main.c

如果想要编译上面的工程,在没有使用makefile的情况下,可能需要使用如下的编译命令:

xuqiang@ubuntu:~/makefile/program$ cc -c foo.c foo.h # 编译foo.o
xuqiang@ubuntu:~/makefile/program$ cc -c main.c foo.h # 编译main.o
xuqiang@ubuntu:~/makefile/program$ cc foo.o main.o -o nomakefile # 生成工程,需要依赖foo.o和main.o
xuqiang@ubuntu:~/makefile/program$ ls
foo.c foo.h foo.h.gch foo.o main.c main.o makefile nomakefile

通过上面的命令生成nomakefile工程编译完成的文件。那么可能比较懒的程序员就在想这个很类似于一个批处理的过程,那么能不能将整个过程编写成脚本的形式,减少命令的输入,makefile就是用来将手动编译自动化的一个工具。

1.2 文件编译依赖树

查看上面的手动编译流程的话,为了生成nomakefile文件,需要存在foo.o文件和main.o文件,如果想要生成foo.o文件,需要编译foo.c,为了生成main.o,那么需要编译main.c文件,如此即生成一个所谓的文件编译依赖树:

通过手动编译文件的话,显然是将文件全部重新编译,在makefile中如果说依赖的文件没有更新的话,那么目标文件是不会重新编译的。

<2>. 快速体验makefile

还是上面例子如果使用makefile来管理,事情会变得如此简单,首先编写makefile文件:

# makefile comment

OBJECTS=foo.o main.o
hellomakefile:${OBJECTS}
cc ${OBJECTS} -o hellomakefile
foo.o:foo.c foo.h
cc -c foo.c
@echo "compile foo.c foo.h"
main.o:main.c foo.h
cc -c main.c
clean:
rm *.o
完成之后目录:

.

|-- foo.c
|-- foo.h
|-- main.c
`-- makefile
在该目录下执行make命令,make将在当前目录中查找名为makefile或者是Makefile的文件,如果使用的不是这两个名字的话,需要使用make -f your-make-file-name,解析该文件,并生成二进制文件hellomakefile。

查看上面的makefile,可以看出:

1. makefile中可以使用#添加行注释

2. makefile文件笼统的将是一个个规则的集合,每个规则是由目标开始,然后是该目标依赖的文件,下一行以tab键开始,然后是生成目标所需的命令。

目标:依赖文件,以空格隔开

生成目标文件的命令

3. makefile在执行默认会将第一个目标做为最终目标,在这个文件就是hellomakefile,make在执行时将自动生成“最终目标”所依赖的文件,也就是main.o和foo.o文件。

4. makefile中可以定义变量(或者称之为宏),在程序的其他部分中使用,这里也就是变量(宏)OBJECTS。

5. makefile中可以使用内建函数,例如上面中的@echo函数。

<3>. makefile变量

makefile中用户可以自定义变量,例如:OBJECTS=foo.o main.o,那么在下面的makefile中可以使用${OBJECTS}代替该变量定义的值(foo.o,main.o)。另外可以使用默认变量:

$@:表明的是目标文件名,例如在foo.o:foo.c foo.h中$@表示的就是foo.o

$<:表明的是目标所依赖的文件的第一个文件,例如在foo.o:foo.c foo.h表明的是就是foo.c文件。

$?:表明的是所有比目标文件更新的文件的集合,其中使用空格个风格。对于foo.o:foo.c foo.h,如果更新了foo.c文件,那么重新make时,将$?将显示foo.c。这里需要注意的是如果更新了foo.h文件,那么$?将显示foo.c和foo.h文件,主要原因是在foo.c文件中包含了foo.h文件。

<4>. 条件编译

makefile中可以使用类似于编程语言中的跳转命令,如果满足一定的条件,将执行一定的动作。常见的条件编译指令:

ifeq(arg1, arg2) .. endif:如果arg1和arg2相等的话,将执行该区域中的内容。

ifneq(arg1, arg2) .. endif:如果arg1和arg2不相等的话,将执行该区域内的内容。

ifdef ARG .. endif:判定ARG变量是否已经定义

ifndef ARG .. endif:和ifdef相反

上面的语句可以和else一起来使用:

ifneq ("same", "diff")

@echo "same != diff"
else
@echo "same == diff"
endif

<5>. makefile函数

makefile中可以使用内建函数,makefile中的内建函数大多是和字符串相关和目录相关函数。makefile中函数使用$(function-name function-arg),例如$(strip($(STR))),makefile中内建函数大多是和字符串相关的函数,常用函数:strip,finstring等,这些函数和高级语言中的string类的方法是极为类似的,具体可以参考[这里]。

<6>. 参考资料

gun make

1. 本博客中的文章均是个人在学习和项目开发中总结。其中难免存在不足之处 ,欢迎留言指正。 2. 本文版权归作者和博客园共有,转载时,请保留本文链接。


分享到:
评论

相关推荐

    Makefile实战.pdf

    Makefile 实战详解 Makefile 是一个非常重要的工具,在软件开发过程中扮演着非常关键的角色。Makefile 的主要作用是告诉 make 程序如何将源代码编译成可执行文件。Makefile 的好坏直接影响着项目的开发效率,一个好...

    Linux Makefile工程实战教程.zip

    在这个“Linux Makefile工程实战教程”中,你将深入学习如何编写和运用Makefile,从基础概念到复杂的项目构建,一步步构建一个模拟MP3项目的Makefile。 首先,你需要了解程序的编译和链接基础。在`1.2 程序的编译和...

    Makefile工程实战.pdf

    在深入探讨Makefile实战之前,让我们回顾一下Makefile的基础知识。Makefile是一个自动化构建工具,它定义了一系列的规则来决定哪些文件需要被编译或链接,以及如何进行这些操作。在给定的描述中,我们将逐步构建一个...

    Makefile和CMake实战.pdf

    Makefile和CMake实战

    makefile详细实战经典教程

    makefile是软件构建工具make的配置文件,它描述了软件编译时的构建规则和依赖关系。makefile的作用主要体现在它能够自动、高效地处理编译和链接过程中的依赖关系,从而简化了复杂软件项目的构建过程。通过定义一系列...

    makefile基础与实战编译大型C-C++项目(linux).zip

    网盘文件永久链接 0-makefile课程介绍 1动手编写第一个makefile编译c++多...14xserver项目makefile实战自动生成install和uninstall 15完成xserver项目多目标的安装和卸载 16自动生成makefile中的头文件依赖重构xserver

    跟我一起写makefile

    #### 四、Makefile实战案例 为了更好地理解Makefile的工作原理,下面是一个简单的示例: 假设有一个简单的C语言程序,包含以下几个文件: - `main.c` - `util.h` - `util.c` 目标是生成名为`app`的可执行文件。...

    makefile全套资料&lds链接脚本&通用makefile例子.rar

    《全面解析Makefile与lds链接脚本:通用模板与实战示例》 Makefile是软件构建过程中的核心工具,它定义了程序构建的规则和步骤,使得编译、链接等操作自动化,极大地提高了开发效率。lds(Linker Script)则是连接...

    Makefile基础与实战编译大型C-C++项目

    ### Makefile基础与实战编译大型C/C++项目 #### 0. 课程介绍 - **Makefile概述**:Makefile是一种用于自动化构建过程的脚本文件,它通过指定依赖关系来控制编译过程,避免重复编译相同的目标文件。 - **目标与受众...

    makefile经典书籍

    #### 六、Makefile实战案例 1. **Hello World 示例**:一个简单的 C 语言程序,演示如何使用 Makefile 构建。 2. **动态库构建**:构建动态库并将其链接到可执行文件中,展示 Makefile 在处理复杂依赖时的能力。 3. ...

    Linux Makefile工程实战视频教程

    总之,Linux Makefile工程实战视频教程是一个深入浅出的学习资源,适合希望提升软件开发自动化水平的开发者,特别是对Linux环境下项目构建流程感兴趣的人员。通过学习,你将能有效地管理复杂的项目,提高工作效率,...

    Makefile从0到精通的代码教程

    3. 实战项目:参与开源项目,观察并学习他们的Makefile编写方式。 掌握Makefile不仅可以提升开发效率,还能让你更好地理解和管理项目构建流程。通过不断实践和学习,你将能够编写出更加高效、灵活的Makefile,成为...

    跟我一起写Makefile--陈皓

    除了理论知识,本书还注重实践,提供了丰富的示例和实战指导。读者可以在学习过程中动手编写自己的Makefile,通过实际操作来加深理解和记忆。书中还会涉及Makefile与其他工具(如GCC、G++等编译器)的配合使用,以及...

    跟我一起写Makefile

    ### 五、Makefile实战应用 1. **编译C/C++程序**:定义CC编译器,CFLAGS编译选项,LDFLAGS链接选项,然后编写规则来编译和链接源码。 2. **清理目标**:通常会有一个`clean`目标,用于删除生成的临时和目标文件。 3...

    makefile的写法

    #### 实战演练 理解了以上概念后,实践是掌握Makefile写法的关键。通过实际编写和调试Makefile,结合具体的项目需求,可以逐渐熟悉Makefile的各种特性和技巧。例如,可以尝试为一个简单的C或C++项目编写Makefile,...

    makefile 学习手册

    9. **示例与实战**:通过具体的项目案例,演示如何编写完整的Makefile来管理一个中大型软件项目。 配合书中内容,你还可以参考《GNU make中文版》(GNU_make_zh_CN.pdf)进行深入学习。这本书可能详细解释了GNU make...

    makefile-nginx案例.zip

    一份关于makefile编写的代码案例,仔细看看注释,多多了解一下make。 老师,要带着大家,从无到有产生这套 通讯架构源代码【项目/工程】 项目 肯定会有多个源文件,头文件,会分别存放到多个目录;我们要规划项目...

    caffe中需要的Makefile文件,如果需要Makefile.config文件,直接资源描述链接caffe部分,配置全部贴出

    实战Ubuntu16.04+显卡驱动+anaconda3+cuda9.0+cudnn7.0+tensorflow-gpu+keras+caffe+pip更换国内源博客中需要的makefile文件: https://mp.csdn.net/postedit/85336542 可以兼容opencv3.1 opencv3.2,hdf5等编译出错的...

Global site tag (gtag.js) - Google Analytics