Chinaunix首页 | 论坛 | 博客
  • 博客访问: 690239
  • 博文数量: 214
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:02
文章分类

全部博文(214)

文章存档

2008年(43)

2007年(171)

我的朋友

分类:

2007-10-02 18:56:04

库:

         linux中,生成可执行文件,如果链接一般的.o文件,则整个文件内容都会装入可执行文件,如果链接的是库,则只从库中找出用到的变量和函数,装如可执行文件。因此将编译好的目标模块统一放在库中是个较好的习惯。

         建立和维护库规则:

形式1liblibmember1libmember2)……

make遇到这样的规则会自动给lib赋予·LIBRARY属性,给member赋予·LIBRARYM属性。

形式2lib ·LIBRARYmember1  member2 ……

显式指定·LIBRARY属性。

形式3lib((entry))

一旦make识别这样的形式,会自动给lib赋予·LIBRARY属性、entry赋予·SYMBOL属性,然后根据entry在库中找相依的成员文件。返回该entry的成员的建立时间,用真正的文件名替换entry。然后的处理与直接给出成员文件名一样。

根据.o文件更新库: ar –ruv 库名 .o文件名

mylib: mylib(file1.o)

         gcc –c file1.c

         ar –ruv mylib file1.o

         rm file1.o

mylib: mylib(file2.o)

         gcc –c file2.c

         ar –ruv mylib file2.o

         rm file2.o

…………

有多少个成员,写多少规则,麻烦……

 

mylibmylibfile1.o file2.o ……)

         gcc –c $?:b.c

         ar –ruv $@ $?

         rm  –f  $?

 

内部规则.c.o

         .o.a:

                   $(AR)  $(ARFLAGS) $@ $?

                   rm  -f $?

         可以直接简写成: mylibmylibfile1.omylib(file2.o) …………

       Make处理整个语句时,先检查库的依赖文件,从第一个文件file1.o开始,如果file1.o晚于file1.c,应用.c.o规则。然后第二个依赖文件…………,所有依赖文件处理完,应用.o.a规则更新库。Make在识别mylib为库后,会自动加上.a扩展名。所以在终端输出的信息都显示为mylib.a

         .a:

                   make $@

 

使用库进行链接:

         可执行文件的依赖文件列表中用的库成员:lib(成员文件名)或者lib((成员entry)),然后命令行的ld只要加上参数lib就可以了。

         内部规则:.o.e:

                                               $(LD)  $(LDFLAGS) –o $@ $< $(LDLIBS)

         LDLIBS定义了标准函数库的列表。用到自定义的库,可以LDLIBS+=库名。

         LDLIBS+=mulib

         prog.emylibfile1.o

         make维护prog.e是会根据内部规则为他找依赖文件和更新命令。

 

#Makefile中的函数:

         Makefile中的函数使用必须指明函数名字和参数。函数处理的结果将返回到在makefile文件中的调用处。格式:

         $(函数名 参数,参数,……)    

         ${函数名 参数,参数,……}

         如:

         $(wildcard 参数)         展开一列所有符合参数描述的文件名列表

         $(patsubst  %.c%.o,参数3)   三个参数分别是匹配模式、替换模式、字符列表

        

         Shell函数:makeshell函数的返回结果返回到调用点前,会把换行和回车统一替换成空格,如果最后字符是换行或回车,去掉。

         SOUR=$(shell cat foo)

 

#makefile中的条件语句:

         ifeq/ifneq (arg1arg2)

         ifeq/ifneq arg1”“arg2

……‘arg1’‘arg2

…… arg1”‘arg2

……‘arg1’“arg2

         ……………………

else

         ……………………

endif

阅读(847) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~