在AIX平台如何创建动态库

  对UNIX 平台,动态库的创建大同小异,都是通过编译器(实际上为ld )生
成。除此之外,
      在AIX 平台,系统提供了丰富的工具创建动态库。
      从大的范围看有两种不同的方法可以创建动态库,一种是按照传统的方式,
编写输出符号
      文件,创建动态库。另一种可通过编译器提供的参数选项,自动生成输出符
号文件创建动态
      库。将逐一给出介绍。
      按照传统的方法创建动态库,关键的问题是如何编写输出符号文件,Visual
Age C/C++
      这一产品给我们提供了一个比较好的工具CreateExportList 帮助我们完
成。参考下面的例子,
      将给出详细的步骤说明,如何创建输出符号文件。
      测试用例为C 程序文件,文件名为show.c 和trans.c ,源码分别为:
      /*
      ** show.c
      */

      #include <stdio.h>

      void show(char *pt){
      printf("The showing text : %s/n", pt);
      }

      /*
      ** trans.c
      */

      #include <string.h>

      void trans(char *str1) {
      char str[20];

      strcpy(str, str1);
      show(str);

      }

      上面的两个示例程序中,show.c 包含函数show() ,trans.c 包含函数
trans() ,借助于CreateExportList
      工具,首先生成输出符号文件,步骤如下:
      1 )编译源程序show.c 和trans.c
                  xlc –c show.c
                  xlc –c trans.c
                  生成相应的目标文件show.o 和trans.o 2 )创建包含目标文
件的纯文本文件
                  创建此文件的目的是帮助我们收集动态库包含的目标文件,这
一步并不是必需的,假设文件名为
                  objlist ,内容如下:
                  show.o
                  trans.o 3 )创建输出符号文件,文件包含动态库要输出的所
有符号,假定文件名为exp.f
                  /usr/vac/bin/CreateExportList exp.f –f objlist
                  如果没有objlist 文件,也可以将目标文件逐一列示:
                  /usr/vac/bin/CreateExportList exp.f show.o trans.o
                  查看文件exp.f 内容为:
                  show
                  trans 4 )编辑输出符号文件,在文件起始处增加#! 动态库
名行,假定要创建的动态库名为libct.so ,如下:
                  #!libct.so 5 )编辑输出符号文件,删除不希望输出的符
号。CreateExportList 创建的输出文件可能包含所有的函数,
      无论是调用的还是被调用,需要删除掉不希望输出的符号,或调用的系统函数。

            输出符号文件创建完成后,接下来,就可以创建动态库了。前面已经
提过,动态库是 由编译器创建的,这一点与静态库的创建有本质的区别,如下:
      xlc –bE:exp.f –bnoentry -bM:SRE –olibct.so show.o trans.o
      本质上,这是有ld 完成的,xlc 只是将参数传递给ld 。这可以节省部分工
作,这是因为,相对于xlc ,ld 是
      比较最底层的操作,需要对系统提供的库比较熟悉。如果直接使用ld ,必
须要清楚,创建库需要的所有资源。
      假如我们简单的将以上命令的xlc 替换为ld ,请看以下输出结果:
      [root@ibmp630#]ld -bE:exp.f -bnoentry -bM:SRE -o libct.so show.o
trans.o
      ld: 0711-317 ERROR: Undefined symbol: .printf
      ld: 0711-317 ERROR: Undefined symbol: .strcpy
      ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more
information
            正确的使用命令,如下:
            ld –bE:exp.f –bnoentry -bM:SRE –olibct.so show.o trans.o –lc
            至此,按照传统的方法创建动态库已经完成。可以看到,以上的步骤
比较多,且 繁琐,实际上Visual Age C/C++ 同样提供了一种相对简单的方法,只
需使用编译参数-G 即可,步骤分析如下:
      1 ) 编译源程序
                  xlc –c show.c
                  xlc –c trans.c 2 ) 创建动态库
                  xlc –G –olibct.so show.o trans.o 这种方法,简单明了,
省掉好多重复的操作。
      以上,介绍了动态库的创建方法,可以用下面的例子测试创建的动态库:
      int main() {
      show("test show");
      trans("test trans");

      return 0;
      }
      这是一个很简单的例子,通过函数调用测试一下动态库能否使用
      xlc –brtl –o test main.c –lct –L.
      运行test 程序,结果如下:
      [root@ibmp630#]./test
      The showing text : test show
      The showing text : test trans

      对C++ 的程序,创建动态库的方法与上面一致,区别在于编译器应使用xlC
,符号输出文件使用
      /usr/vacpp/bin/CreateExportList 创建。除以上介绍的方法外,也可以使
用工具/usr/vacpp/bin/makeC++SharedLib 创建。
      总之,动态库的创建是一个比较复杂的过程,也有可能会出现创建完动态库
后,不能使用的情况。以上,只
      是一个比较通用的方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值