作者:遗忘的花心本分尐男人 | 来源:互联网 | 2023-09-25 08:45
精通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) printf("This is the first dll src!\n"); 程序pr2.c也提供了自己的函数print和变量p,如代码3-5所示: 代码3-5 动态库源码(节自/code/chapter3/d2.c) 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” 选项。
相关文章:
封面 前言 目录 策划 作者
动态库 变长参数 文件锁