手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

创建和使用库:静态、共享和动态

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
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



文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS