linux上的makefile怎么使用?

作者&投稿:阚柿 (若有异议请与网页底部的电邮联系)
linux里面的make和makefile是做什么的?~

1、make:是一个非常重要的编译命令,本质上它是一个程序。利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。

2、Makefile文件 :Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作,本质上makefile文件是个文本文件,用于配置编译过程。makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。

3、在 UNIX 系统中,习惯使用 Makefile 作为 makfile 文件。如果要使用其他文件作为 makefile,则可利用类似下面的 make 命令选项指定 makefile 文件:

  $ make -f Makefile.debug

  例如,一个名为prog的程序由三个C源文件filea.c、fileb.c和filec.c以及库文件LS编译生成,这三个文件还分别包含自己的头文件a.h 、b.h和c.h。通常情况下,C编译器将会输出三个目标文件filea.o、fileb.o和filec.o。假设filea.c和fileb.c都要声明用到一个名为defs的文件,但filec.c不用。即在filea.c和fileb.c里都有这样的声明:
  #include "defs"
  那么下面的文档就描述了这些文件之间的相互联系:
   #It is a example for describing makefile
   prog : filea.o fileb.o filec.o
   cc filea.o fileb.o filec.o -LS -o prog
   filea.o : filea.c a.h defs
   cc -c filea.c
   fileb.o : fileb.c b.h defs
   cc -c fileb.c
   filec.o : filec.c c.h
   cc -c filec.c
  这个描述文档就是一个简单的makefile文件。

Linux系统下makefile的作用把编写好的源文件进行编译与链接,makefile的基本格式如下:
target… :prerequisite…(Tab键)command#格式解释target:生成的目标文件,可以是可执行文件,也可以是中间目标文件prerequisite:生成target所需要的文件command:make需要的执行命令,一般是编译与链接的命令,命令前面必须要有Tab键才能有效果
makefile的简单例子(用的Ubuntu11.10):

makefile文件与hello.c源文件都在新建的command文件夹中;然后转到控制台再切换到command目录下,直接输入make会才生hello.o与exe.out两个文件,如下图:

在控制台下的命令:

命令解释:
gcc –c hello.c:编译command目录下的hello.c源文件,编译之后会生成hello.o中间文件。rm:删除command目录下的hello.o与exe.out文件./exe.out:输出exe.out可执行文件,hello.c中写的是Hello World!make:make命令与make exe命令执行的效果是一样的。

一、Makefile的规则

在讲述这个Makefile之前,还是先来粗略地看一看Makefile的规则。
target ... : prerequisites ...
command
.......

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签
(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisi
tes中的文件,其生成规则定义在command中。

二、一个示例

正如前面所说的,如果一个工程有3个头文件,和8个C文件,为了完成前面所述的那三
个规则,的Makefile应该是下面的这个样子的。

edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

反斜杠(\)是换行符的意思。这样比较便于Makefile的易读。可以把这个内容保存在
文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就
可以生成执行文件edit。如果要删除执行文件和所有的中间目标文件,那么,只要简单地
执行一下“make clean”就可以了。

在这个makefile中,目标文件(target)包含:执行文件edit和中间目标文件(*.o),依
赖文件(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。每一个 .o 文件都有
一组依赖文件,而这些 .o 文件又是执行文件 edit 的依赖文件。依赖关系的实质上就是
说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。

在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以
一个Tab键作为开头。记住,make并不管命令是怎么工作的,他只管执行所定义的命令。m
ake会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期
要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命
令。

这里要说明一点的是,clean不是一个文件,它只不过是一个动作名字,有点像C语言中的
lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自
动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的
名字。这样的方法非常有用,可以在一个makefile中定义不用的编译或是和编译无关
的命令,比如程序的打包,程序的备份,等等。

三、makefile中使用变量

在上面的例子中,先让看看edit的规则:

edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

可以看到[.o]文件的字符串被重复了两次,如果的工程需要加入一个新的[.o]文
件,那么需要在两个地方加(应该是三个地方,还有一个地方在 clean中)。当然,
的makefile并不复杂,所以在两个地方加也不累,但如果makefile变得复杂,那么我
们就有可能会忘掉一个需要加入的地方,而导致编译失败。所以,为了makefile的易维护
,在makefile中可以使用变量。makefile的变量也就是一个字符串,理解成 C语言中
的宏可能会更好。

比如,声明一个变量,叫objects, OBJECTS, objs, OBJS, obj, 或是 OBJ,反正不管
什么啦,只要能够表示obj文件就行了。在makefile一开始就这样定义:

objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

于是,就可以很方便地在的makefile中以“$(objects)”的方式来使用这个变量
了,于是的改良版makefile就变成下面这个样子:

objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

edit : $(objects)
cc -o edit $(objects)
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit $(objects)
于是如果有新的 .o 文件加入,只需简单地修改一下 objects 变量就可以了。

四、make是如何工作的

在默认的方式下,输入make命令通过makefile编译程序时,具体的内部机制如下:

1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“
edit”这个文件,并把这个文件作为最终的目标文件。
3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个
文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
4、如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性
,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生
命make的终极任务,也就是执行文件edit了。

这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第
一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么ma
ke就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理
。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,
那么对不起,我就不工作啦。

通过上述分析,知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它
后面所定义的命令将不会被自动执行,不过,可以显示要make执行。即命令——“ma
ke clean”,以此来清除所有的目标文件,以便重编译。

于是在编程中,如果这个工程已被编译过了,当修改了其中一个源文件,比如fi
le.c,那么根据的依赖性,的目标file.o会被重编译(也就是在这个依性关系后
面所定义的命令),于是file.o的文件也是最新的啦,于是file.o的文件修改时间要比ed
it要新,所以edit也会被重新链接了(详见edit目标文件后定义的命令)。

而如果改变了“command.h”,那么,kdb.o、command.o和files.o都会被重编译,并
且,edit会被重链接。



直接 cd 到makefile 的目录 运行 make

需要自己编写Makefile文件你才能make成功的。给你份比较好的介绍如何编写Makefile的文档吧。看懂前3章基本可以自己写makefile了。




openssl怎么编译成动态库
复制一个nt.mak并命名为nt_md.mak,修改里面的 “CFLAG= \/MT \/Ox ...” 为\/MD ,然后重新编译 ,执行 nmake -f ms\/nt_md.mak 7.其它命令:nmake -f ms\/ntdll.mak clean \/\/ 清除编译的中间文件 nmake -f ms\/ntdll.mak install \/\/ 安装 ,主要是linux下面会自动放到程序目录中 。

linux如何加载驱动
linux操作系统下,加载驱动的方式有二:静态加载驱动;动态加载驱动;作为前者,静态加载驱动是通过将驱动程序编译到内核而进行的一系列配置操作;对于后者而言则是向内核注册设备信息,从而在kernel启动后,再通过insmod指令,关联好主、次设备号,从而以模块的形式进行加载的;二者各有优点,所以应用的场合...

使用Arch Linux 做桌面有何优势和注意事项
使用archlinux一年半以来,图形界面使用的是lxde,个人认为优势和该注意的事项如下:一、 优势 安装包滚动发行,可以实时保证自己系统里的所有可执行文件和函数库都是最新的。这样可以让自己不断地跟进linux世界的进展。yaourt和makpkg可以用于管理源代码安装的程序。 archlinux使用pacman(与Redhat下的yum,...

重赏~~~电脑中的各个文件名
ROM 基于盒式磁带的家庭游戏仿真器文件(来自Atari 2600、Colecovision、Sega、Nintendo等盒式磁带里的ROM完全拷贝,在两个仿真器之间不可互修改) ROV Rescue Rover数据文件 RPM RedHat包管理器包(用于Linux) RPT Microsoft Visual Basic Crystal报表文件 RRS Ace game Road Rash保存的文件 RSL Borland的Paradox 7报表 ...

安卓系统开发工具(安卓系统开发工具有哪些)
3、APPMakr软件开发工具这也是一款可视化的开发工具,主要的对象还是针对不会编程的用户提供的一个功能齐全的手机APP客户端软件开发平台,里面带有功能齐全的DIY工具包,用户可以根据自己的需求DIY设计自己需要的APP软件。4、APICloudAppmakr虽然好用,但是国外的。在国内使用起来,还是有些麻烦。国内也有这样...

ftp putfile出现12003错误 IIS的FTP应该怎么设置
官网上下了个最新的x264,我下载的文件是last_x264.tar.bz2。解压命令为#tar -jxv -f last_x264.tar.bz2,解压后的目录为x264-snapshot-20130313-2245。进入解压后的目录,执行命令.\/configure --disable-asm,则会生成config.mak。之后就需要修改这个config.mak文件了,改写ARCH=ARM SYS=Linux CC...

如何在 Mac OS X 下編譯,安裝 gcc
一、Mac OS X中make和gcc命令的安装 在编译Lua前需要做的准备工作。我将lua-5.2.2.tar.gz下载到苹果电脑中,解压后进行编译时,发现我的Mac OS X 没有mak命令,也没有gcc命令。检测苹果电脑的Mac OS X中是否有make命令的方法,可在控制台键入命令:which make 如果有该命令,则会返回提示:\/...

如何用Android NDK编译FFmpeg
android的NDK开发需要在linux下进行:因为需要把C\/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。安装android-ndk开发包,这个开发包可以在google android 官网下载: 通过这个开发包的工具才能将android jni 的C\/C++的代码编译成库 android应用...

在ARM上运行交叉编译后的opencv文件,没有输出
第一步:#CC=arm-linux-gnueabihf-gcc .\/configure --enable-shared --host=arm-linux --disable-asm --prefix=\/usr\/arm-linux-gnueabihf 第二步:修改config.mak里的参数,因为makefile要调用config.mak,所以修改方法同makefile 第三步:#sudo make sudo make install Libxvid的交叉编译 第一步...

安卓版开发工具?
下面就具体介绍常用的五款app开发工具:1、BiznessApps:BiznessApps为中小企业提嫌历供了一个快速制作手机App的平台。它目前支持iOS(iPhone、iPad)及Android平台上的本机App制作。用户完全不需要具备任何编程知识,只要进行按钮勾选及拖拽,就能完成大部分设计工作。2、APPMakr:它的主要业液绝务是为用户...

红花岗区19312847788: linux中怎么用makefile -
丰废裸花: 一、Makefile的规则 在讲述这个Makefile之前,还是先来粗略地看一看Makefile的规则.target ... : prerequisites ...command.......target也就是一个目标文件,可以是Object File,也可以是执行文件.还可以是一个标签 (Label),对于标签这种特性...

红花岗区19312847788: 如何在linux下写makefile -
丰废裸花: 在命令行新建一个文件,名字叫Makefile:touch Makefile 然后用vi打开Makefile 在里面写:test: gcc test.c -o test // 这里自己改文件名字 保存退出 然后执行make命令就行.

红花岗区19312847788: linux 怎么找到makefile -
丰废裸花: c中写的是Hello World!makeLinux系统下makefile的作用把编写好的源文件进行编译与链接:target… :prerequisite…(Tab键)command#格式解释 target:生成的目标文件,可以是可执行文件:gcc –c hello.c:编译command目录下的hello.c源文件...

红花岗区19312847788: linux下的makefile的使用? -
丰废裸花: 建立makefile文件,内容如下 bin:1.c 2.c gcc 1.c 2.c -o bin 然后执行make

红花岗区19312847788: linux下怎么编辑makefile文件!求助!!!!!!!!!!! -
丰废裸花: ./configure --help可以查看帮助文档,根据自己的需求写各参数设置,执行./configure生成定制的makefile文件.比如,apache源代码安装./configure --prefix=/export/apache 安装目录在/export/apache

红花岗区19312847788: Linux中怎样写makefile文件
丰废裸花: 先找个模板参考吧,好的makefile可能是别人十几年的心血,因为工程大,参与的人,c和h文件不计其数.makefile无非就是从c文件和h文件编译成到o文件(它们之间还有次序关系),然后再编译成一个执行文件.

红花岗区19312847788: linux 命令行怎么写make makefile命令 -
丰废裸花: 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一...

红花岗区19312847788: linux 5如何安装makefile软件 -
丰废裸花: Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作.makefile是自己写的,不是安装的.安装make整个过程可以分为以下几步:1) 取得应用软件:通过下载、购买光盘的方法获得;2) ...

红花岗区19312847788: 哪位大神帮我下,怎么编写linux下makefile文件? -
丰废裸花: 比如,你有个文件 hello.c:# include <stdio.h> main() { printf("Hello, world!\n"); } 你再写一个 Makefile:Hello: hello.c gcc hello.c -o Hello 然后,你直接下命令:make 你就得到一个叫 Hello 的可执行文件.最后,你下命令:./Hello 就可以看到执行结果:Hello, World 注意:作为执行命令的 “gcc” 前面必须有 一个 Tab 键

红花岗区19312847788: linux下makefile用什么写 -
丰废裸花: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23INC_PATH := -I./include/ LIB_PATH := -L./lib/ LIBS := $(LIB_PATH) -lerr -larm CC := gcc LD := gcc CFLAGS := -O2 -Wall $(INC_PATH) SRC_PATH := ./source SOURCE := $(...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网