Unix下设计动态库的方法《精通Unix下C语言编程与项目实践》(一)

简介:

  精通Unix下C语言编程与项目实践

之动态库的生成

作者:朱云翔,胡平 

3.3 动态库的生成

动态库的生成可分为三个步骤,设计库源码、编译位置无关码(PIC)型.o文件和链接动态库。链接动态库的命令包含特殊标志,与链接静态库和链接可执行目标文件有区别,而且不同的Unix系统,其实现的细节也不尽相同。
编译PIC.o中间文件的方法一般是采用C语言编译器的“-KPIC”或者“-fpic”选项,有的Unix版本C语言编译器缺省带上了PIC标志。创建最终动态库的方法一般是采用C语言编译器的“-G”或者“-shared”选项,或者直接使用工具ld创建。
本处设计一个创建并调用动态库的例子,分别将源文件d1.cd2.c编译为动态库d1.sod2.so,并在主程序中调用之。

1. 设计库源码

程序pr1.c提供了函数print和变量p,如代码3-4所示:
代码3-4 动态库源码(节自/code/chapter3/d1.c
int p = 2;
void print()
{
        printf("This is the first dll src!\n");
}
程序pr2.c也提供了自己的函数print和变量p,如代码3-5所示:
代码3-5 动态库源码(节自/code/chapter3/d2.c
int p = 3;
void print()
{
        printf("This is the second dll src!\n");
}

2. ScoSolaris系列

    通过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.sod2.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中,ccxlc系列都是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标记的 erokrtlnortllibnosymbolicnoautoexp  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 选项。



 本文转自 zhuyunxiang 51CTO博客,原文链接:http://blog.51cto.com/zhuyunxiang/128695,如需转载请自行联系原作者



相关文章
|
Unix Linux C语言
计算机操作系统实验一 Unix/Linux编程开发环境
计算机操作系统实验一 Unix/Linux编程开发环境
169 0
|
2月前
|
算法 Unix 数据安全/隐私保护
Python编程--UNIX口令破解机
Python编程--UNIX口令破解机
29 1
|
6月前
|
Unix C语言
用C语言打造自己的Unix风格ls命令
用C语言打造自己的Unix风格ls命令
|
6月前
|
Unix
Unix环境高级编程(第三版)中apue.h头文件及其依赖安装教程
Unix环境高级编程(第三版)中apue.h头文件及其依赖安装教程
126 0
|
Unix Shell Python
unix高级编程-fork和execve
unix高级编程-fork和execve
65 0
|
Ubuntu Unix Shell
unix高级编程-fork之后父子进程共享文件
unix高级编程-fork之后父子进程共享文件
65 0
|
Unix Linux
unix高级编程-僵尸进程和孤儿进程
unix高级编程-僵尸进程和孤儿进程
63 0
|
Unix Linux 调度
unix编程-fork
unix编程-fork
69 0
|
存储 C语言
C语言程序设计——设计一个学生管理系统(完美运行的程序(●‘◡‘●))
C语言程序设计——设计一个学生管理系统(完美运行的程序(●‘◡‘●))
C语言程序设计——设计一个学生管理系统(完美运行的程序(●‘◡‘●))
|
C语言
【初始C语言】/*简单一篇博客学会设计扫雷小游戏*/
【初始C语言】/*简单一篇博客学会设计扫雷小游戏*/
97 0
【初始C语言】/*简单一篇博客学会设计扫雷小游戏*/