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

之动态库的生成

作者:朱云翔,胡平

3.3 动态库的生成

动态库的生成可分为三个步骤,设计库源码、编译位置无关码(PIC)型.o文件和链接动态库。链接动态库的命令包含特殊标志,与链接静态库和链接可执行目标文件有区别,而且不同的Unix系统,其实现的细节也不尽相同。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
编译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. 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语言编程与项目实践》(一)相关推荐

  1. 文件锁操作《精通Unix下C语言编程与项目实践》之三

    文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的职场感悟吧.不值钱的软件人才 精力充沛与事业成功 我的诗歌:都是我的打 ...

  2. Unix朝代歌《精通Unix下C语言编程与项目实践》读书笔记(7)

      文章试读  <精通Unix下C语言编程与项目实践>读书笔记(new) <精通Unix下C语言编程与项目实践>文章试读 第1回 回评论读者展迷茫,出<笔记>浪子释 ...

  3. linux+下c语言编程项目,精通UNIX下C语言编程与项目实践

    cc -I  //include 目录 -L //静态库目录?动态也可以 -l //小写L,接静态库名称?动态也可以 -DXXX='"XXFF"' //-D直接定义宏 -c 只编译 ...

  4. 《精通Unix下C语言编程与项目实践》目录

    书籍目录: <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  ...

  5. 关于《精通Unix下C语言编程与项目实践》的试读策划

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一.试读内容 ...

  6. 两个人投票的c语言程序,设计网页投票器(二)《精通Unix下C语言编程与项目实践》之十...

    本处设计一个网页投票器,它访问"www.zhiliaowang.com"上的服务程序"/toupiaoceshi.asp",并通过"name" ...

  7. 精通unix下c语言与项目实践,《精通Unix下C语言编程与项目实践》读书笔记(2)...

    51CTO博客开发社区大管家小废物simeon技术专栏王乾De技术Blog[爱生活,爱学习]sery李晨光网管小王 "聂隐娘",三十三剑客之一,裴铏所撰<传奇>中人物. ...

  8. 不要在Unix下遍桌面程序(1)《精通Unix下C语言与项目实践》读书笔记(9)

    <精通Unix下C语言编程与项目实践>读书笔记(new) 文章试读  不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八 ...

  9. g++ 编译mysql动态库_Linux下g++编译以及使用静态库和动态库的方法详解

    下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在windows环境下,我们通常在IDE如VS的 ...

最新文章

  1. 基于html5海贼王单页视差滚动特效
  2. 解决ubuntu上opengl的问题
  3. Xmanager7如何通过SSH连接远程服务器
  4. java bitset_Java BitSet nextSetBit()方法与示例
  5. Springboot(java)程序部署到k8s
  6. Node实现的异步I/O
  7. TeeChart Pro VCL/FMX教程(六):使用系列(二)
  8. java 字符转换为字符串_java中将字符(Char)转换为字符串的四种方式
  9. 计算机毕业设计ssm基于SSM框架的人力资源管理系统89kq5系统+程序+源码+lw+远程部署
  10. 全国车辆限行查询api 全国限行限号数据服务
  11. 相对url和相对路径
  12. 报错:error: not found: value spark val ratings = spark.sparkContext.(解决方案)
  13. 明源售楼系统技术解析 签约管理(二)
  14. 2022微信企业邮箱登录入口介绍,企业微信企业邮箱怎么开通注册?
  15. sql中如何按拼音笔画排序
  16. 商家冷启难题,快手每天8亿流量能解决吗?
  17. dwcss样式中英对照_DW中常用css样式四种类型详细解析说明
  18. leetcode第643题C++
  19. jQuery实现简单分页
  20. 来自一个敲了5年代码的网络安全工程师的自述(目前薪资20K)

热门文章

  1. Java NIO 学习笔记 缓冲区补充
  2. kali学习日记第二篇 -- Nessus
  3. Spring注入service为null另类解决办法 工具类 一般类 静态 非controller
  4. 电子电路基础复习 —— 电感
  5. 【七招破解WinXP系统访问网络变慢的故障】
  6. 大数据教程(9.1)流量汇总排序的mr实现
  7. Python + Selenium 自动发布文章(二):简书
  8. margin负值的理解和应用
  9. Windows 10版星巴克应用现身官网
  10. 利用content为伊特元素追加三个小点