静态、共享和动态库_C/C++_编程开发_程序员俱乐部
中国优秀的程序员网站
程序员频道
CXYCLUB技术
地图
最新资讯
|
百度新闻
|
GOOGLE地图
|
RSS订阅
|
更多
职场话题
生活休闲
恋爱交友
程序人生
学习进修
职业发展
项目管理
求职面试
程序员创业
JAVA
.NET
C/C++
Ruby
Delphi
JavaScript
PHP
ASP
JSP
HTML
XML
移动开发
开发工具
其他
编程开发
数据库
操作系统
新闻资讯
互联网
非技术区
非技术区
生活休闲
恋爱交友
职业发展
求职面试
程序人生
移动开发
开发工具
DB2
MySql
Sybase
开发
JAVA
.NET
PHP
C/C++
数据库
SQL Server
Oracle
互联网
运营
推广
营销
SEO
系统
Linux
Unix
Windows
资讯
动态
产品
人物
创业
职场
学习
管理
热搜:
译码
编码
哈夫曼
Flex
HTTP
内存
堆栈
成段更新
线段树
异常
约瑟夫环
串口通讯
线程
javascript
JS
译码
编码
哈夫曼
Flex
HTTP
内存
堆栈
成段更新
线段树
异常
更多>>
您所在的位置:
程序员俱乐部
>
编程开发
>
C/C++
> 静态、共享和动态库
静态、共享和动态库
2011/1/12 8:43:10 zhanglibin1986 http://zhanglibin1986.javaeye.com
我要评论(
0
)
摘要:
C语言中有一些函数不需要进行编译,有一些函数也可以在多个文件中使用。一般来说,这些函数都会执行一些标准任务,如数据库输入/输出操作或屏幕控制等。可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行连接。这样就不必在每次开发程序时都对这些通用的函数进行编译了。不同类型的应用程序将会使用不同的函数库。例如:libdbm库中组包含了对数据库文件进行访问的dbm函数,需要对数据库进行操作的程序就会与该库进行连接
标签:
C语言中有一些函数不需要进行编译,有一些函数也可以在多个文件中使用。一般来说,这些函数都会执行一些标准任务,如数据库输入/输出操作或屏幕控制等。可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行连接。这样就不必在每次开发程序时都对这些通用的函数进行编译了。
不同类型的应用程序将会使用不同的函数库。例如:libdbm库中组包含了对数据库文件进行访问的dbm函数,需要对数据库进行操作的程序就会与该库进行连接。数学应用程序将使用数学库libm,X-Windows应用程序将使用Xlib库,libX11。另外,所有的程序都将使用标准的C函数库。libc,该库中包含了诸好
内存
管理或输入输出操作的基本函数,这些库都存放在/usr/lib这些系统公用的目录中,系统中的任何用户都可以利用这些库。当然用户也可以建立自己专用的库函数,供自己或其它指定的人员使用。
库可以有三种使用的形式:静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。
已经开发的大多数库都采取共享库的方式。ELF格式的可执行文件使得共享库能够比较容易地实现,当然使用旧的a.out模式也可以实现库的共享。Linux系统中目前可执行文件的标准格式为ELF格式。
GNU库的使用必须遵守Library GNU Public License(LGPL许可
协议
)。该协议与GNU许可协议略有不同,开发人员可以免费使用GNU库进行软件开发,但必须保证向用户提供所用的库函数的源代码。
系统中可用的库都存放在/usr/lib和/lib目录中。库
文件名
由前缀lib和库名以及后缀组成。根据库的类型不同,后缀名也不一样。共享库的后缀名由.so和
版本
号组成,静态库的后缀名为.a。采用旧的a.out格式的共享库的后缀名为.sa。
libname.so.major.minor
libname.a
这里的name可以是任何字符串,用来唯一标识某个库。该字符串可以是一个单字、几个字符、甚至一个字母。数学共享库的库名为libm.so.5,这里的标识字符为m,版本号为5。libm.a则是静态数学库。X-Windows库名为libX11.so.6,这里使用X11作为库的标识,版本号为6。
使用
gcc编译器
就可以将库与自己开发的程序连接起来,例如:libc.so.5中包含了标准的输入输出函数,当连接程序进行目标代码连接时会自动搜索该程序并将其连接到生成的可执行文件中。标准的输入输出库中包含了许多基本的输入输出函数,如printf函数等。也可以连接其它的一些系统函数库,如数学库等,但与libc.so.5不同,大部分其它的系统库需要在命令行中显式指定所用的库名。
在/usr /lib和/lib目录中可以找到绝大多数的共享库。连接时将首先搜索这两个目录。有一些库也可能存放在特定的目录中,在/etc/ld.conf配置文件中给出了这些目录的列表。连接程序也会对列出的这些目录进行搜索。在默认情况下,Linux将首先搜索指定库的共享版本,如果找不到,才会去搜索静态版本。在对共享库进行更新或安装新库后,必须运行ldconfig命令更新/etc/ld.conf文件中相应的项(如果使用RPM进行安装,一般会自动进行更新,不过也不能保证这一点)。
在gcc编译器中引用可搜索到的目录中的库文件时,需要使用-l选项和库名。在gcc命令行上输入-lm可以在程序中连接标准算术库,-l将首先使用libname.so进行搜索,这里是libm.so。下面的
例子
将使用算术库创建bookrecs 程序,请注意这里的-lm选项。
$ gcc main.c io.c -o bookrecs -lm
系统中还有一些其它可用的库,常用的是libncurses.a库,包含了一些简单的鼠标移动例程。在命令行中使用-lncurses选项引用libncurses.so库。下面的例子同时调用了数学和光标库。
$ gcc mian.c io.c -o bookrecs -lm -lncurses
在引用其它目录中的库时,需要使用-ldir选项指定该目录。该选项指定了搜索库函数时其它路径。在下面的例子中,用户在连接时使用了mydir目录中的myio.so库文件。
$ gcc main.c -o bookrecs -lmydir -lmyio
.a的是为了支持较老的a.out格式的可执行文件的
.so的是支持elf格式的可执行文件的库。
静态库是指编译连接时,把库文件的代码全部加入到可执行文件中,所以生成的文件较大, 但运行时,就不再需要库文件了。动态库正好相反,在编译连接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件
.a是静态库文件,可以用ar 命令生成。
.so是动态库文件,编译时加上指定的选项即可生成,具体选项看相应的系统文档了。。。。
IBM AIX下如下:
$(CC) $(SHOPT) $(SHLIBS) a.o b.o -o lib$@$(DBBUILDTAIL)
假设你有test1.c test2.c test3.c , 编写成动态链接库
1. 先编译成test1.o test2.o test3.o
2. gcc -shared -W1, -soname,libvTest.so.1 -o libvTest.so.1.0 *.o
上一篇:
宏(#define)定义函数妙用
下一篇:
fork函数
相关文章
查看所有评论(
0
)
我要评论
发表评论
用户名:
匿名
最新文章
使..
大..
·
Qt中线程跟信号槽的关系
·
C++经典书籍推荐和下载
·
使用Visual C++ 2
·
【2011.8.2】<
·
大连2011ACM网络赛【5
·
C++ 简单读写文本文件、统
·
C++ 简单读写文本文件、统
·
指向数据成员的指针
·
c++基础知识(一)expl
·
C/C++基本数据类型
·
VC 预编译头
·
学习C++的感触
·
初学boost::any的测
·
c语言堆栈问题
·
一些比较出名的开源库和框架
最新标签
译码
编码
哈夫曼
Flex
HTTP
内存
堆栈
成段更新
线段树
异常
今日热点
·
eclipse mingw qt搭建c+
·
高质量C++/C编程学习笔记(四)---
·
高质量C++/C编程学习笔记(三)---
·
该死的C++(一)
·
Visual Assist X10.6.
·
高质量C++/C编程学习笔记(一)---
·
高质量C++/C编程学习笔记(五)---
·
这算fread的BUG吗吗吗
·
编写连接到cassandra 的客户端过
·
文本SOCKET客户端,多进程可解决网速
推荐文章
Huffman..
穿过已知点画平..
·
Adobe CS5.5(X3
·
Adobe CS5.5(X3
·
MAC下配置Eclipse
·
linux-多线程-互斥锁在多进程共享
·
Visual Assist X10.6.
·
VC中OnTimer()函数
·
Huffman编码算法及C语言实现(2)
·
穿过已知点画平滑曲线(3次贝塞尔曲线)
·
基于ATL开发ActiveX控件(第一节
·
Linux下g++编译C++连接orac
·
【转】Ubuntu 10.04 + Ec
·
wcsncpy 及 wcscpy 函数用
·
eclipse mingw qt搭建c+
·
MFC多文档程序启动时一个文档创建两个视
·
LINUX下QT+OpenGL编程初步
English
|
关于我们
|
诚聘英才
|
联系我们
|
网站大事
|
友情链接
|
意见反馈
|
网站地图
Powered by
程序员俱乐部
程序提供: HugoCMS 2.0
网站备案:苏ICP备11048748号-1