通用Makefile的编写(大地小神之个人收藏).pdfVIP

通用Makefile的编写(大地小神之个人收藏).pdf

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一个通用 Makefile 的编写 我们在 Linux 环境下开发程序,少不了要自己编写 Makefile ,一 个稍微大一些的工程下面都会包含很多.c 的源文件。如果我们用gcc 去一个一个编译每一个源文件的话,效率会低很多,但是如果我们 可以写一个 Makefile ,那么只需要执行一个make 就 OK 了,这样大 大提高了开发效率。但是 Makefile 的语法规则众多,而且缺乏参考 资料,对于初学者来说,写起来还是有一定的难度,往往令很多人 望而生畏。下面我们介绍一个比较通用而且简洁的Makefile ,大 家只要对它稍作修改就可以用在你们自己的工程里了。 现在假设我们有一个工程叫 my_project ,工程源码目录下面有 app1.c,app2.c,app3.c,app4.c 以及main.c 这五个源文件。我们现在需 要编译出 app1.o,app2.o,app3.o,app4.c 以及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 :(wildcart : 通配符) 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:

文档评论(0)

聚好信息咨询 + 关注
官方认证
服务提供商

本公司能够提供如下服务:办公文档整理、试卷、文档转换。

认证主体 鹤壁市淇滨区聚好信息咨询服务部
IP属地天津
统一社会信用代码/组织机构代码
92410611MA40H8BL0Q

1亿VIP精品文档

相关文档