`
duyouhua1214
  • 浏览: 236879 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一个通用Makefile的编写

 
阅读更多

作者:杨硕,华清远见嵌入式学院讲师。

我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c的源文件。如果我们用gcc去一个一个编译每一个源文件的话,效率会低很多,但是如果我们可以写一个Makefile,那么只需要执行一个make就OK了,这样大大提高了开发效率。但是Makefile的语法规则众多,而且缺乏参考资料,对于初学者来说,写起来还是有一定的难度,往往令很多人望而生畏。下面我们介绍一个比较通用而且简洁的Makefile,大家只要对它稍作修改就可以用在你们自己的工程里了。

现在假设我们有一个工程叫my_project,工程源码目录下面有app1.c,app2.c,app3.c以及main.c这五个源文件。我们现在需要编译出app1.o,app2.o,app3.o以及main.o,然后再把这些.o文件链接成为一个ELF格式的可执行程序叫做my_app。我们先看一个最简单的Makefile如何编写:

my_app : main.o, app1.o, app2.o, app3.o, app4.o
                gcc –o my_app main.o app1.o, app2.o, app3.o, app4.o
        main.o : main.c
                gcc –c main.c
        app1.o : app1.c
                gcc –c app1.c
        app2.o : app2.c
                gcc –c app2.c
        app3.o : app3.c
                gcc –c app3.c
        clean :
                rm main.o app1.o, app2.o, app3.o, app4.o

这是一个傻瓜式的Makefile,不灵活,而且不具备可复制性,想象一个如果我们的工程下面有50个源文件,那岂不是要一个一个写出来。我们的目标是写一个Makefile,只要稍作修改就可以在各个工程之间通用。

下面这个Makefile就可以满足这个要求:

SRCS = $(wildcard *.c)
        OBJS = $(SRCS:.c = .o)
        CC = gcc
        INCLUDES = -I/home/noah/build_sqlite3/include
        LIBS = -L/home/noah/build_sqlite3/lib -lsqlite3
        CCFLAGS = -g -Wall -O0

my_app : $(OBJS)
                $(CC) $^ -o $@ $(INCLUDES) $(LIBS)

%.o : %.c
                $(CC) -c $< $(CCFLAGS)
        clean:
                rm *.o

大家看这个Makefile和前一个比起来是不是简洁很多,当然理解起来不如上一个那么直观。实际上编写Makefile就是为了提高我们的工作效率,而不是增加我们的工作量。因此Makefile为我们提供了很多强大的功能,比如定义变量,使用通配符等等。只要合理利用,就可以达到事半功倍的效果。

下面我们一条一条分析这个Makefile:

SRCS = $(wildcard *.c)
        这条语句定义了一个变量SRCS,它的值就是当前面目录下面所有的以.c结尾的源文件。
        OBJS = $(SRCS:.c = .o)
        这里变量OBJS的值就是将SRCS里面所有.c文件编译出的.o目标文件
        CC = gcc
        变量CC代表我们要使用的编译器
        INCLUDES = -I/home/noah/build_sqlite3/include
        LIBS = -L/home/noah/build_sqlite3/lib -lsqlite3
        这里指定除了编译器默认的头文件和库文件的路径之外需要额外引用的头文件路径以及库的路径。
        CCFLAGS = -g -Wall -O0
        CCFLAGS变量存放的是编译选项
        my_app : $(OBJS)
                $(CC) $^ -o $@ $(INCLUDES) $(LIBS)
        my_app依赖于所有的.o文件,$^代表$(OBJS),$@代表my_app
        %.o : %.c
                $(CC) -c $< $(CCFLAGS)
        将所有的.c源代码编译成.o目标文件,这样写是不是很省事?
        clean:
                rm *.o
        在执行make clean之后删除所有编译过程中生成的.o文件。

这个Makefile就具备灵活的通用性,我们只要对它稍作修改就可以用在自己的工程里面。当然Makefile还有很多强大的功能,需要我们进一步学习。

 

http://www.eefocus.com/ayayayaya/blog/10-03/185900_8c97f.html

分享到:
评论

相关推荐

    通用Makefile,适用于C/C++混合编程

    通常,一个通用Makefile会包含以下关键部分: 1. **变量定义**:如`CC`(C编译器)、`CXX`(C++编译器)、`CFLAGS`(C编译选项)、`CXXFLAGS`(C++编译选项)等,用于设置编译器和编译选项。 2. **源文件和目标...

    一个项目的通用Makefile的写法

    本文将深入探讨如何编写一个通用的Makefile,包括顶层目录下的Makefile、子目录下的Makefile以及Makefile.build的用法。 1. **顶层Makefile**: 顶层Makefile通常负责整体项目的构建流程,它会调用子目录中的...

    makefile编写及实例

    在编程世界中,`Makefile` 是一个至关重要的工具,特别是在多文件项目中,它用于自动化编译和链接过程,节省了开发者的时间和精力。`Makefile` 的编写是项目构建自动化的核心,它定义了一系列规则,告诉操作系统如何...

    通用makefile编写

    下面我们将详细讨论Makefile的基本结构、规则、目标、依赖关系以及如何编写一个通用的Makefile。 ### 1. Makefile基本结构 Makefile通常由目标(target)、依赖文件(dependency)和命令(command)三部分组成。一...

    韦东山通用makefile.zip

    在IT行业中,`Makefile`是一个非常重要的工具,特别是在软件构建和自动化...`韦东山通用makefile.zip`提供的资源是学习和实践`Makefile`编写的一个良好起点,尤其对于C++开发者来说,它可以作为构建系统的基础框架。

    LINUX C++下多个Makefile编写方法

    首先,我们要理解一个主Makefile(通常命名为`Makefile`)的角色。主Makefile是整个项目的入口,它负责调用其他子Makefile来编译和链接各个部分。主Makefile通常包含以下内容: 1. **目标定义**:定义最终可执行...

    通用的makefile模板

    通用的 `Makefile` 模板旨在提供一个灵活、模块化和跨平台的解决方案,使得开发者能够在不同环境中轻松地编译和管理项目。本文将深入探讨这个模板的核心特性及其在实际开发中的应用。 首先,`Makefile` 的模块化...

    Linux下C语言的makefile编写

    通过本文的学习,你应该已经掌握了makefile的基础知识以及如何编写一个简单的makefile。makefile不仅是Linux下软件项目管理的重要工具,也是成为一名专业程序员的必备技能之一。掌握makefile不仅可以提升个人能力,...

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

    本资料集合旨在深入探讨这两个关键概念,并提供通用Makefile的实例,帮助开发者更好地理解和应用。 首先,让我们从GNU Make中文手册开始。手册详细介绍了Makefile的语法、规则和变量,以及如何编写高效的Makefile。...

    linux makefile 编写 规则 编译多个文件

    在上面的例子中,`%.o: %.c` 是一个通用规则,适用于所有源文件。当源文件改变时,`make`会自动重新编译对应的`.o`文件。 ### 5. 链接步骤 `$(CC) $(CFLAGS) -o $@ $(OBJECTS)` 是链接步骤,它将所有的`.o`文件...

    万能通用性Makefile/C++/C全自动编译实例

    Makefile编写实例: 1.前提是需要安装MInGw——c/c++编译器,不懂的可以私信我哈; 2.本程序是利用bat脚本直接运行Makefile,非常方便;直接点击运行“run.bat”即可编译,方便快捷。 3.makefile为采用通用性规则...

    07.通用的Makefile_源码_文档_图片.rar

    由韦东山老师讲授的“通用Makefile课程”深入浅出地介绍了如何利用Makefile来管理和编译源码,从而提高开发效率。这个课程的原代码及相关文档,对于学习和理解Makefile的用法具有很高的参考价值。 Makefile,...

    一个通用的Makefile

    ### 通用Makefile详解 #### 一、引言 在软件开发过程中,特别是涉及大量C语言编程时,Makefile作为一种自动化构建工具,极大地提升了开发效率。一个精心设计的Makefile可以减少编译时间,简化构建过程,并使得项目...

    Makefile编写学习教程

    ### Makefile编写学习教程 #### 一、Makefile的重要性及基本概念 Makefile是一种用于自动化构建过程的脚本文件,广泛应用于Unix、Linux系统下的软件开发。它通过定义一系列规则来控制编译流程,帮助开发者高效管理...

    通用 Makefile,工作用到时可以直接使用

    通用 Makefile 就是这样一个模板,适用于多种不同类型的 C/C++ 项目,减少了开发者配置和维护的时间。 通用 Makefile 通常包含以下部分: 1. **变量定义**:Makefile 中的变量用于存储各种路径、编译器、链接器...

    Linux下Makefile文件的编写

    例如,在上述Makefile示例中,我们可以定义一个名为`CC`的变量,表示编译器路径,这样可以在整个Makefile文件中统一使用这个变量。 ```makefile CC = cc CFLAGS = -Wall -g all: edit edit: main.o kbd.o command...

    通用makefile编译工程文件

    本篇文章将深入探讨 `Makefile` 的基本概念、常用规则以及如何创建一个通用的 `Makefile`。 首先,我们需要理解 `Makefile` 的结构。`Makefile` 主要由目标(target)、依赖文件(dependency)和命令(command)三...

Global site tag (gtag.js) - Google Analytics