快速业务通道

linux下静/动态链接库编程例子

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-02

今天要用到静态链接库,就学习了一下相关知识,总结如下:

静态链接库(一般命名为libxxx.a)就是很多.o文件的集合,在你的项目中如果有一个子模快,这个子模块只是给总控模块提供一个函数接口,那么你就可以考虑把这个子模快编译成静态链接库libxxx.a,然后在总控模块中编译的时候,只需-L包含链接库所在的目录,再-lxxx引用链接库就行.

当然,你也可以用动态链接库,具体的动态链接库创建和引用,做法和静态链接库大同小异,只是动态链接库是在程序执行的时候是动态的添加到内存的,可以实现进程之间的资源共享.
另外动态链接库可以做到所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源:也就是说什么时候或者什么情况下,链接载入哪个动态链接库函数,完全由程序员在程序代码中控制.这样,当你有一个相当大的工程,每次运行的时候,不同的操作需求,就只会有一小部分程序被载入内存.

具体给一个例子,先看一下工程的目录结构:
$ ls -RF
.:
lib/ main.c Makefile

./lib:
Makefile.a Makefile.so string.h strlen.c strnlen.c

在工程主目录下有main.c主控程序,Makefile文件和lib目录
lib目录下有string.h头文件,strlen.c和strnlen.c,这三个文件里的函数就是我们想生成的库函数
Makefile.a生成静态链接库的makefile文件
Makefile.so生成动态链接库的makefile文件



好,让我们看一看这些文件的具体内容:

头文件string.h,声明相关函数原形
$cat lib/string.h

int Strlen(char *pStr);
int StrNlen(char *pStr, unsigned long ulMaxLen);



strlen.c:函数Strlen的实现,获取给定字符串的长度
$cat lib/strlen.c

#include <stdio.h>
#include <assert.h>
int Strlen(char *pStr)
{
unsigned long ulLength;
assert(NULL != pStr);

ulLength = 0;
while(*pStr )
{
ulLength ;
}
return ulLength;
}



strnlen.c:函数StrNlen的实现,获取给定字符串的长度,如果输入字符串的长度大于指定的最大长度,则返回最大长度,否者返回字符串的实际长度
$cat lib/strnlen.c

#include<stdio.h>
#include<assert.h>
int StrNlen(char *pStr, unsigned long ulMaxLen)
{
unsigned long ulLength;
assert(NULL != pStr);
if(ulMaxLen <= 0)
{
printf("Wrong Max Length!n");
return -1;
}
ulLength = 0;
while(*pStr && ulLength < ulMaxLen)
{
ulLength ;
}
return ulLength;
}


这三个文件是在lib/目录下.

Makefile.a:生成静态链接库的makefile文件
$ cat lib/Makefile.a

libstr.a: strlen.o strnlen.o
$(AR) r $@ $^
$(RM) $^

.PHONY : clean
clean :
rm -f libstr.a

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号