博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unix下设计动态库的方法《精通Unix下C语言编程与项目实践》(一)
阅读量:6670 次
发布时间:2019-06-25

本文共 2163 字,大约阅读时间需要 7 分钟。

  精通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 –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
 
选项。
 本文转自 zhuyunxiang 51CTO博客,原文链接:http://blog.51cto.com/zhuyunxiang/128695,如需转载请自行联系原作者
你可能感兴趣的文章
职业发展
查看>>
Linux下环境变量设置
查看>>
phonegap 安装和使用eclipse
查看>>
ASP.NET MVC使用动态产生meta
查看>>
WIN7无法访问共享打印机及文件的解决办法
查看>>
C语言基础(9)-字符串格式化输入和输出
查看>>
【转】使用import scope解决maven继承(单)问题
查看>>
你 我 我们 技术 让世界变得更好一些
查看>>
WCF安全:通过 扩展实现用户名密码认证
查看>>
Spring Boot中增强对MongoDB的配置(连接池等)
查看>>
IDEA中maven工程指定JDK版本
查看>>
基于 HTML5 的 WebGL 3D 智能楼宇监控系统
查看>>
一次阿里的面试
查看>>
数据库事务隔离级别
查看>>
JSONP跨域以及之前的历史
查看>>
FLEX库在苹果废弃ASL之后的解决方案
查看>>
基于django的视频点播网站开发-step2-搭建环境
查看>>
Qtum量子链与亚马逊AWS中国云服务达成合作
查看>>
Java并发知识点快速复习手册(下)
查看>>
div自适应填充剩余宽度的方法
查看>>