快速业务通道

linux库文件的制作

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-19
文件的路径加到-L参数里面,

  把库文件名(去掉打头的lib和结尾的.a)加到-l参数后面.如下面所示

  gcc -o main -L/root/exercise main.o -ltest

  此时就会生成一个名为main的可执行文件

  另外,注意- l参数好象应该加到输入文件名的后面,否则会报错.

  比如gcc -o main -L/root/exercise -ltest main.o就会提示

  main.o(.text 0x11): In function `main'''':

  : undefined reference to `test''''

  collect2: ld returned 1 exit status

  原因我还不清楚:-)

  ⑷执行可执行文件查看效果

  执行./main, 输出

  test

  说明执行成功.

  四、动态库的编写

  1、概述

  动态库一般以.so结尾,就是shared object的意思.

  其基本生成步骤为

  ⑴编写函数代码

  ⑵编译生成动态库文件,要加上 -shared 和 -fpic 选项 ,

  库文件名以lib开头, 以.so 结尾.

  使用方式分为两种: 隐式调用和显示调用

  隐式调用类似于静态库的使用,但需修改动态链接库的配置文件/etc/ld.so.conf;

  显示调用则是在主程序里使用dlopen、dlsym、dlerror、dlclose等系统函数.

  具体的调用方式会在 "五、动态库的调用" 中详细说明.

  2、编写最简单的动态库文件

  为了便于对照, 我们仍然采用静态库中的文件做例子.

  编写如下两个文件,注意放在同一目录中

  myalib.h //静态库头文件

  myalib.c //静态库实现文件

  //myalib.h 文件的内容

  void test();

  //myalib.c 文件的内容

  #inlcude

  void test()

  {

  printf("testn");

  }

  3、编译生成动态库 ,库文件名以lib开头, 以.so 结尾.

  gcc -fpic -shared -o libtest.so myalib.c

  此时就生成一个libtest.so文件

  五、动态库的隐式调用

  隐式调用的含义是代码里不出现库文件名,就是说这个代码和

  调用静态库的代码是类似的.

  1、编写测试文件

  //main.c 测试动态库隐式调用的程序

  #include "myalib.h" //要把函数的头文件包含进来,否则编译时会报错

  int main(int argc,char* argv[])

  {

  test();

  return 0;

  }

  2、 编译测试程序,与静态库类似,要把头文件的路径加到-I参数里面

  gcc -I /root/exercise -o main.o -c main.c

  现在生成了一个main.o文件

  3、连接生成测试程序

  gcc -o main -L/root/exercise main.o -ltest

  现在生成了一个main文件

  4、执行测试程序

  ./main

  此时出现提示

  ./main: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory.

  这个原因就是程序运行时并不知道动态库所在的路径,因此自然找不到.

  解决这个问题的办法有三种.见下节

  六、使动态库被系统共享的三种办法

  (再次说明: 本节参考了计算机世界网雨亦奇的文章"LINUX动态链接库高级应用"

  地址http://www.ccw.com.cn/htm/center/prog/02_3_13_3_2.asp)

  (1)拷贝动态链接库到系统共享目录下,或在系统共享目录下为该动态链接库

  建立连接(硬连接或符号连接均可,常用符号连接).这里说的系统共享目录,

  指的是LINUX动态链接库存放的目录,包括

  /lib,/usr/lib以及/etc/ld.so.conf文件内所列的一系列目录.

  实例:执行

  # cp libtest.so /lib

  # ldconfig

  或:

  # ln -s `pwd`/libtest.so /lib

  # ldconfig

  注意pwd前后有两个反引号`,其目的是取得pwd命令的输出,即当前目录.

  此时再执行main,即可成功.

  (2)将动态链接库所在目录名追

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号