`
duyouhua1214
  • 浏览: 228197 次
  • 性别: 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编写

    通用Makefile编写

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

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

    EDA/PLD中的一个通用Makefile的编写

    现在我们讲使用数据库来进行变成,具体的提供了SELECT INSERT UPDATE DELETE等数据库的执行语句,这是在数据库的接口,当在图形下显示数据时需要使用... 这些类提供了访问数据库,提出一个连接请求,如同文件访问一样

    通用型Makefile,自己写的

    这个makefile是自己所写的一个通用型文件,适用于一些多文档多目录的项目,可根据自己需求更改其中某些字段即可。

    通用Makefile文件

    参考Linux内核的Makefile编写了一个通用的Makefile,它可以用来编译应用程序: ① 支持多个目录、多层目录、多个文件; ② 支持给所有文件设置编译选项; ③ 支持给某个目录设置编译选项; ④ 支持给某个文件单独...

    Makefile文件例程于工程模板

    包含6个Makefile工程的例程,从最简单的Makefile编写到通用模板。可以直接执行make来测试工程的编译

    一个带类似IDE目录树的makefile实例

    这里是我写的一个makefile demo,它的关键之处在编译前导入config_xxx_file_list.mk,这个文件可以看成是IDE环境的代码目录树。具体怎么修改这个目录树相信打开文件大家都能看懂。 该实例包含两个工程,LibMakefile...

    Linux通过Makefile模型

    通过该Makefile模型,可以自己修改源文件和头文件的路径后,执行make和make clean即可,通用、快速完成makefile的编写

    gnu_makefile文档pdf html

    2.2一个简单的Makefile文件 2.3make处理Makefile文件的过程 2.4使用变量简化Makefile文件 2.5让make推断命令 2.6另一种风格的Makefile文件 2.7在目录中删除文件的规则 3 编写Makefile文件 3.1Makefile文件的...

    avr_makefile:基于ATMEL AVR开发的通用自制makefile

    该项目(文档)是关于基于 ATMEL AVR 的开发的通用自制 makefile。 介绍 我创建了这个 makefile,因为我对自动生成的 makefile 不满意,可以在网上找到。 所有这些都太笼统和复杂,很难理解他们在做什么,他们使用了...

    Makefile_For_GNU_C_CXX_depstar_ver0.583.2

    这个模板的功能有: 1、支持任意目录的源文件。 2、支持src和include目录分别设置。 3、在运行"make"之后,可执行... 有这个模板在手,也许就不再需要为编写Makefile发愁了。 简单、易用、堪比现在流行IDE中的功能。

    My_General_Makefile.zip_Linux/Unix编程_C/C++_

    这是一个Unix/Linux下基于GNU Make环境编写的一个C/C++通用Makefile

    linux和window通用的 C 邮件发送 源代码

    linux和window通用的 C语言编写的 邮件发送,附带源代码,window使用的工程是VC6,里面附带了linux下的makefile文件。

    基于Linux设备树的spi驱动纯C语言源码

    最主要的是这个代码可以通用,是实际工作经验下通用的驱动框架,以后其他的驱动编写只要在这个代码基础上稍加修改就可以,确定不需要嘛? 如果下载后对您有用,请为我点个赞哟~提前在此表示我衷心的感谢!

    as-substrate-runtime:这是用AssemblyScript编写的基于底物PoC帐户的运行时

    AssemblyScript中的底物运行时 ...我们在根目录中有一个Makefile,该文件具有3个操作,这些操作演示了运行中的AssemblyScript运行时。 make run-node-demo 执行所有必需的操作,以使Substrate节点开始使用Assem

    Frescare K21/cortex-M4,系列处理器Bootloader

    本工程我原本打算用来移植ucoosiii 而建立的一个简洁的裸机程序,后来因为其他项目耽搁了,ucoss iii 部分移植还没有实现。 本裸机程序是采用gcc 编译(因为嵌入式开发大部分都是使用gcc 的,而且gcc开发需要我们...

    Processor-Project:具有用C ++编写的唯一指令集的虚拟处理器

    处理器项目 一个虚拟处理器,其指令集类似于C ++中的ARM。...该程序包括一个用于编译的Makefile。运行make将按预期编译程序。 make debug可用于在程序执行期间启用调试打印输出,以检查指令解码和其他详细

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    后打开另一个窗口,一个是打开另一个窗口而自身不消失。可以看到他们实现的 方法是不同的。 三、Qt Creator 登录对话框(原创) 实现功能: 在弹出对话框中填写用户名和密码,按下登录按钮,如果用户名和密码均正确...

Global site tag (gtag.js) - Google Analytics