Unix下设计动态库的方法《精通Unix下C语言编程与项目实践》(一) 推荐
2009-02-05 08:18
357 查看
精通Unix下C语言编程与项目实践
之动态库的生成
作者:朱云翔,胡平
3.3 动态库的生成
动态库的生成可分为三个步骤,设计库源码、编译位置无关码(PIC)型.o文件和链接动态库。链接动态库的命令包含特殊标志,与链接静态库和链接可执行目标文件有区别,而且不同的Unix系统,其实现的细节也不尽相同。编译PIC型.o中间文件的方法一般是采用C语言编译器的“-KPIC”或者“-fpic”选项,有的Unix版本C语言编译器缺省带上了PIC标志。创建最终动态库的方法一般是采用C语言编译器的“-G”或者“-shared”选项,或者直接使用工具ld创建。
本处设计一个创建并调用动态库的例子,分别将源文件d1.c和d2.c编译为动态库d1.so和d2.so,并在主程序中调用之。
1. 设计库源码
程序pr1.c提供了函数print和变量p,如代码3-4所示:[align=center]代码3-4 动态库源码(节自/code/chapter3/d1.c)[/align]
int p = 2;
void print()
{
printf("This is the first dll src!\n");
}
程序pr2.c也提供了自己的函数print和变量p,如代码3-5所示:
[align=center]代码3-5 动态库源码(节自/code/chapter3/d2.c)[/align]
int p = 3;
void print()
{
printf("This is the second dll src!\n");
}
2. Sco和Solaris系列
通过cc的“-KPIC”选项生成PIC中间文件,再通过cc的“-G”选项链接成动态库:cc –O -KPIC -c d1.c d2.c /* 编译以“.o”为扩展名的中间目标文件d1.o和d2.o */
cc -G -o d1.so d1.o /* 根据中间目标文件d1.o创建动态库文件d1.so */
cc -G -o d2.so d2.o /* 根据中间目标文件d2.o创建动态库文件d2.so */
或者直接一步到位,直接创建动态库文件d1.so和d2.so:
cc -O -KPIC -G -o d1.so d1.c /* 创建动态库文件d1.so */
cc -O -KPIC -G -o d2.so d2.c /* 创建动态库文件d2.so */
3. HP-UNIX系列
创建 PIC 中间文件的编译器选项是+z,创建动态库的链接器标志是-b:cc +z -c d1.c d2.c /* 编译以“.o”为扩展名的中间目标文件d1.o和d2.o */
ld -b -o d1.so d1.o /* 根据中间目标文件d1.o创建动态库文件d1.so */
ld -b -o d2.so d2.o /* 根据中间目标文件d2.o创建动态库文件d2.so */
与大部分系统不同的是,HP-UNIX缺省使用“.sl”做动态库的扩展名。
4. AIX系列
在AIX中,cc和xlc系列都是C语言编译器。xlc_r4 -c d1.c d2.c /* 编译以“.o”为扩展名的中间目标文件d1.o和d2.o */
ld -G -bnoentry -bexpall -lc d1.o -o d1.so /* 创建动态库文件d1.so */
ld -G -bnoentry -bexpall -lc d2.o -o d2.so /* 创建动态库文件d2.so */
ld是创建动态库的工具,它的常用选项与cc类似,比如“-l”标识链接库,“-o”标识目标文件名称等。本处“-G”选项等价于指定带有-b标记的 erok、rtl、nortllib、nosymbolic、noautoexp 和 M:SRE选项,它将创建动态库对象。更多的ld信息请参考相关文档。
5. Linux和其他使用gcc编译器的Unix
gcc -fpic -c d1.c d2.c /* 编译以“.o”为扩展名的中间目标文件d1.o和d2.o */gcc -shared -o d1.so d1.o /* 根据中间目标文件d1.o创建动态库文件d1.so */
gcc -shared -o d2.so d2.o /* 根据中间目标文件d2.o创建动态库文件d2.so */
或者直接一步到位:
gcc -O -fpic -shared -o d1.so d1.c /* 创建动态库文件d1.so */
gcc -O -fpic -shared -o d2.so d2.c /* 创建动态库文件d2.so */
某些版本的gcc上也可以使用“-G”替换“-shared” 选项。
相关文章:
封面 前言 目录 策划 作者
动态库 变长参数 文件锁
相关文章推荐
- Unix下设计动态库的方法《精通Unix下C语言编程与项目实践》(一)
- CPU+GPU集群计算中的一种动态负载均衡设计方法
- 机器学习系统设计的推荐指导方法
- 存储动态数据时,数据库的设计方法
- 线程池? 如何设计一个动态大小的线程池,有哪些方法?
- 数据库设计中动态列的设计方法
- Java动态验证码单线设计的两种方法
- extjs中第一次访问有效,第二次访问出现部分组件无法显示的,动态改变组件的label值的方法,ExtJs中组件最好少使用ID属性(推荐更多使用Name属性)
- 策略设计模式:父类持有接口成员变量,动态设定接口成员实现类,动态改变方法
- js动态获取子复选项并设计全选及提交的实现方法
- JS中动态创建元素的三种方法总结(推荐)
- 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题
- Ajax动态访问数据库设计html多级select下拉菜单的方法
- 【虚拟化实战】容灾设计之一设计方法 推荐
- 数据库设计方法、规范与技巧(推荐)
- Net设计模式实例之模板方法模式(Template Mothed Pattern)(1) 推荐
- ELF文件的动态链接器 原理 设计和代码 - ChinaUnix.net
- Teechart动态设计方法
- 【设计模式】动态代理,附使用方法
- 基于JSP的RSS阅读器的设计与实现方法(推荐)