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

 


推荐阅读
  • 201720181 20155339 《信息安全系统设计基础》第六周学习总结
    2017-2018-120155339《信息安全系统设计基础》第六周学习总结教材学习内容总结控制转移:从ak指令到a(k1)指令的过渡。控制转移序列称为处理器的控制流 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • UNIX高级环境编程 第11、12章 线程及其属性
    第11章线程11.2线程概念线程资源:线程ID,一组寄存器,栈,调度优先级和策略,信号屏蔽字,e ... [详细]
  • CentOS7系统目录LINUX有四种基本文件系统类型普通文件:如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等,可用cat、less、 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • Linux下C语言的几道经典面试题小结(分享)
    本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正。1、如果在Linux下使用GCC ... [详细]
  • Howtobuilda./configure&&make&&makeins ... [详细]
  • linux 字符串数组初始化,C++字符数组初始化方法的分析
    发现了一个字符数组初始化的误区,而这个往往能导致比较严重的性能问题,分析介绍如下:往往我们在初始化一个字符数组,大概有如下几 ... [详细]
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社区 版权所有