热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

精通Unix下C语言编程与项目实践之动态库的生成作者:朱云翔,胡平3.3动态库的生成动态库的生成可分为三个步骤,设计库源码、编译位置无关码

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

 


推荐阅读
  • ARM汇编基础基于Keil创建STM32汇编程序的编写
    文章目录一、新建项目(1)工具介绍(2)创建项目:二、配置环境(1)配置芯片&#x ... [详细]
  • 本视频教程将带你快速了解 Android 开发的基础知识,并详细讲解如何在 Android 应用中使用 SQLite 数据库进行数据存储和管理。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文详细介绍了如何在 Android 应用中获取系统的版本号,包括具体的应用场景和实现步骤。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 单片机入门指南:基础理论与实践
    本文介绍了单片机的基础知识及其应用。单片机是一种将微处理器(类似于CPU)、存储器(类似硬盘和内存)以及多种输入输出接口集成在一块硅片上的微型计算机系统。通过详细解析其内部结构和功能,帮助初学者快速掌握单片机的基本原理和实际操作方法。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • Python SDK,即Python软件开发工具包,是为开发者提供的一系列工具和库,旨在简化使用Python进行应用程序开发的过程。它不仅包括了基本的编程接口,还涵盖了各种实用工具和示例代码,帮助开发者更高效地构建和测试软件。通过使用Python SDK,开发者可以轻松集成复杂的功能模块,提高开发效率和代码质量。 ... [详细]
  • 在C语言程序开发中,调试和错误分析是确保代码正确性和效率的关键步骤。本文通过一个简单的递归函数示例,详细介绍了如何编写和调试C语言程序。具体而言,我们将创建一个名为 `factorial.c` 的文件,实现计算阶乘的功能,并通过逐步调试来分析和解决可能出现的错误。此外,文章还探讨了常见的调试工具和技术,如GDB和断点设置,以帮助开发者高效地定位和修复问题。 ... [详细]
author-avatar
遗忘的花心本分尐男人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有