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

  精通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 所示:
代码 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 �CO -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 选项。
 
相关文章:
封面          前言        目录         策划         作者
动态库        变长参数    文件锁
 
 

你可能感兴趣的:(c,试读,C语言编程,Unix编程,精通Unix下C语言编程)