




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux编程make命令介绍摘要: 在开发一个系统时,一般是将一个系统分成几个模块,这样做提高了系统的可维护性,但由于各个模 块间不可避免存在关联,所以当一个模块改动后,其他模块也许会有所更新,当然对小系统来说,手工编译连接是没问题, 但是如果是一个大系统, 存在很多个模块, 那么手工编译的方法就不适用了。 为此, 在 Linux 系统中,专门提供了一个 make 命令来自动维护目标文件 ,与手工编译和连接相比, make 命令的优点在于他 只更新修改过的文件( 在 Linux 中,一个文件被创建或更新后有一个最后修改时间, make 命令就是通过这个 最后修改时间来判断此文件是否被修改 )
2、, 而对没修改的文件则置之不理,并且make 命令不会漏掉一个需要更新的文件。文件和文件间或模块或模块间有可能存在倚赖关系,make 命令也是依据这种依赖关系来进行维护的, 所以我们有必要了解什么是依赖关系;打个最比喻:如 果我们想玩游戏,必须有游戏光碟和电脑(这两者间存在 依赖关系),而有游戏光碟和电脑的前提条件是必须经济条件允许,另外当你有了游戏光碟后还要根据你的 心情来选择是玩哪种游戏;如下图:玩游戏/游戏光碟 电脑/ / /心情 经济情况make 命令当然不会自己知道这些依赖关系,而需要程序员将这些 依赖关系写入一个叫 makefile 的文件 中。 Makefile 文件中包含着一些
3、目标, 通常目标就是文件名 ,对每一个目标,提供了实现这个目标的一组命令以 及和这个目标有依赖关系的其他目标或文件名,以下是一个简单的 Makefile 的简单例子:# 一个简单的 Makefileprog:prog1.o prog2.o /prog目标依赖 prog1.o 和 prog2.ogcc prog1.o prog2.o -o prog /prog1.o和 prog2.o 生成 progprog1.o:prog1.c lib.h /prog1.o依赖 prog1.c lib.hgcc -c -I. -o prog1.o prog1.cprog2.o:prog2.cgcc -c pro
4、g2.c以上 Mamefile 中定义了三个目标 : prog 、 prog1 和 prog2 ,分号后是依赖文件列表,中间用一个分号 隔开;对于第一个目标文件 prog 来说, 他有两个依赖文件: prog1.o 和 prog2.o ,任何一个依赖文件更新, prog 也要随之更新,命令 gcc prog1.o prog2.o -o prog是生成 prog 的命令。 make 检查目标是否需要更新时采用递归的方法,递归从底层向上对过时目标进行更新, 只有当一个目标所依赖的所有目标都为最新时,这个 目标才会被更新 。 以上面的 Makefile 为例,我们修改了 prog2.c ,执行 ma
5、ke 时,由于目标 prog 依赖 prog1.o 和 prog2.o ,所以要先检查 prog1.o 和 prog2.o 是否过时,目标 prog1.o 依赖 prog1.c 和 lib.h ,由于我们 并没修改这两个文件,所以他们都没有过期,接下来 再检查目标 prog2.o ,他依赖 prog2.c ,由于我们修改 了 prog2.c ,所以 prog2.c 比目标文件 prog2.o 要新,即 prog2.o 过 期,而导致了依赖 prog2.o 的所有目标 都过时;这样 make 会先更新 prog2.o 再更新 prog 。如果某一行过长,已经到了文本编辑器的右边界,可用一个反斜杠
6、()做换行符,反斜杠所连接的所 有行都会被当成一行来处理;另外在 Makefile 中涉及的文件名允许使用通配符(?或* )。有时候为了简化命令的书写,可以在 Makefile 中定义一些宏和使用缩写,下面是几个很使用的缩写:$ 代表该目标的全名$* 代表已经删除了后缀的目标名$< 代表该目标的第一个相关目标名 现在就可以使用缩写对以上 Makefile 做相应的修改:# 使用缩写的 Makefile prog:prog1.o prog2.o gcc prog1.o prog2.o -o $ prog1.o:prog1.c lib.h gcc -c -I. -o $ $< prog
7、2.o:prog2.c gcc -c $*.c在一个项目中,可能几个目标中使用同一个文件 a.c ,如果以后这个文件被修改,那么需要修改 Makefile 中 所有的 a.c ,这样就比较麻烦,可以定义宏来解决这个问题,宏可以使 Makefile 更加清晰:# 使用缩写和宏的 MakefileMARCO = prog1.o prog2.o prog:$(MARCO) gcc prog1.o prog2.o -o $ prog1.o:prog1.c lib.h gcc -c -I. -o $ $< prog2.o:prog2.c gcc -c $*.c对于很大的项目来说,自己手写Makef
8、ile 非常麻烦,而标准的GNU软件(如Apacle )都是运行一个con figure 脚本文件来产生 Makefile ; GNU软件automake和autoc onf 就是自动生成 con figure 的工具。开 发人员只需要先定义好宏, automake 处 理后会产生供 autoconf 使用的 Makefine.in ,再用 autoconf 就可 以产生 configure 。要使用 automake 和 autoconf 必须安装: GNU Automake, GNU Autoconf , GNU m4, perl 和 GNU Libtool 。假设你有一个源文件 test
9、.c ,用 autoscan 可以产生一个 configure.scan 文件,编辑这个文件dnl Process this file with autoconf to produce a configure script.AC_INIT(test.c)AC_INIT_AUTOMAKE(test,1.0)dnl Checks for programs.AC_PROG_CCdnl Checks for libraries.dnl Checks for header files.dnl Checks for typedefs, structures, and compiler characteri
10、stics.dnl Checks for library functions.AC_OUTPUT(Makefile)接着将 configure.scan 改名为 cnfigure.in ,再执行 aclocal 和 autoconf ,会产生 aclocal.m4 和 configure 两个文件:我们再编辑 Makefile.am 文件, Makefile.am 文件中包含了我们自己定义的宏以及目标文 件, automake 会读如这个文件并根据我们自己定义的宏产生相应的 Makefile.in 文件:AUTOMAKE_OPTIONS=foreignrun_PROG=testtest_SOU
11、RCE=test.c接下来执行 automake -a ,到目前为止, configure 文件已经成功生成。例子: 从 helloworld 入手下面的过程如果简单地说来就是:新建三个文件:helloworld.cconfigure.inMakefile.am然后执行:aclocal; autoconf; automake -add-missing; ./configure; make; ./helloworld就可以看到 Makefile 被产生出来,而且可以将 helloworld.c 编译通过。很简单吧,几条命令就可以做出一个符合惯例的 Makefile ,感觉如何呀。现在开始介绍详细
12、的过程:1、建目录$ mkdir helloword$ cd helloworld2、helloworld.c然后用你自己最喜欢的编辑器写一个 hellowrold.c 文件,如命令: vi helloworld.c。使用下面的代码作为helloworld.c 的内容。int main(int argc, char* argv)printf("Hello, Linux World! ");return 0;完成后保存退出。现在在 helloworld 目录下就应该有一个你自己写的 helloworld.c 了。3、生成 configure我们使用 autoscan 命令来帮
13、助我们根据目录下的源代码生成一个 configure.in 的模板文件。命令:$ autoscan$ lsconfigure.scan helloworld.c执行后在 hellowrold 目录下会生成一个文件: configure.scan ,我们可以拿它作为 configure.in 的蓝本。现在将 configure.scan 改名为 configure.in ,并且编辑它,按下面的内容修改,去掉无关的语句:=configure.in 内容开始 =# -*- Autoconf -*-# Process this file with autoconf to produce a confi
14、gure script.AC_INIT(helloworld.c)AM_INIT_AUTOMAKE(helloworld, 1.0)# Checks for programs.AC_PROG_CC # Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions. AC_OUTPUT(Makefile) =configure.in 内容结束 =然后执行命令 aclocal 和
15、 autoconf ,分别会产生 aclocal.m4 及 configure 两个文件:$ aclocal$lsaclocal.m4 configure.in helloworld.c$ autoconf$ lsaclocal.m4 autom4te.cache configure configure.in helloworld.c大家可以看到 configure.in 内容是一些宏定义,这些宏经 autoconf 处理后会变成检查系统特性、环境变量、软件必须 的参数的 shell 脚本。autoconf 是用来生成自动配置软件源代码脚本( configure )的工具。 configure
16、 脚本能独立于 autoconf 运行,且 在运行的过程中,不需要用户的干预。要生成 configure 文件,你必须告诉 autoconf 如何找到你所用的宏。 方式是使用 aclocal 程序来生成你的 aclocal.m4aclocal根据configured文件的内容,自动生成aclocal.m4 文件。aclocal 是一个perl脚本程序,它的定义是:“aclocal- create aclocal.m4 by scanning configure.ac ”。autoconf 从 configure.in 这个列举编译软件时所需要各种参数的模板文件中创建 configure 。au
17、toconf需要 GNU m4宏处理器来处理 aclocal.m4,生成configure 脚本。m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。 除了可以展开宏, m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器。4、新建 Makefile.am新建 Makefile.am 文件,命令:$ vi Makefile.am内容如下 :AUTOMAKE_OPTIONS=foreignbin_PROGRAMS=helloworld helloworld_SOURCES=helloworld.cautomake 会根据你写的 Makefile.am 来自动生成 Makefile.in 。bin_PROGRAM将导致编译和连接的目Makef
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 结肠癌护理常规
- 小区交付施工方案
- 2026版《全品高考》选考复习方案物理01 课时作业(一) 走近细胞含答案
- 如何发现胃肠肿瘤信号
- 图书英文面试题及答案
- 幼儿快乐生活健康成长
- 园林会计面试题及答案
- 前厅部考试题及答案
- 幼儿园健康课课件
- 内科主管考试题及答案
- 免疫调节治疗在脑卒中的运用课件
- DB32∕T 186-2015 建筑消防设施检测技术规程
- XX公司“十四五”战略发展规划及年度评价报告(模板)
- 机关档案管理工作培训PPT课件
- 三宝四口及临边防护安全培训讲义
- 油轮、化学品船的基本知识
- (高清正版)T_CAGHP 054—2019 地质灾害治理工程质量检验评定标准(试行)
- 25T汽车吊检验报告
- 变频空调中的永磁电机电感分析
- 高考常考语法填空词性转换汇总
- AOI自动光学检测设备程序编写
评论
0/150
提交评论