首页 > 其它语言 > Linux下C编程之makefile

Linux下C编程之makefile

最近一直在Linux下写C代码,处理基因序列,总共代码才1500行左右,但是在makefile build的时候,效率极低,慢的时候居然需要30多秒,由于此前经验缺乏,对makefile也不甚了解,但是为了提高程序效率,必须深入了解makefile.本文中部分内容摘自大牛博客。

一、makefile基础知识

makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

 

二、有关C程序的编译

C程序源文件,在编译后形成o文件(linux下),接着就需要链接全局变量和函数, 会对所有中间文件打一个包,叫做.a文件。

在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.

 

三、makefile使用

targets : prerequisites
command

这是基本的规则语法

target自然就是目标喽,

prerequisites也就是目标所依赖的文件(或依赖目标)。如果其中的某个文件要比目标文件要新,那么,目标就被认为是“过时的”,被认为是需要重生成的。这个在前面已经讲过了

command是命令,如果其不与“target吐舌rerequisites”在一行,那么,必须以[Tab键]开头,如果和prerequisites在一行,那么可以用分号做为分隔。如果命令太长,你可以使用反斜框(‘\’)作为换行符。

需要注释的时候,使用“#”

下面是一个例子:(来自http://www.cnblogs.com/liyanwei/archive/2010/04/29/1723931.html)

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 \   #生成目标文件的操作系统命令,一定要以一个Tab键作为开头。
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也能定义变量,定义多目标,而且具有不同的风格,可以自动推导,详细知识可以参考这篇博文

http://www.cnblogs.com/liyanwei/archive/2010/04/29/1723931.html


本文固定链接: http://www.devba.com/index.php/archives/860.html | 开发吧

报歉!评论已关闭.