快速业务通道

Linux系统基础开发技术1:构建Linux 库文件

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-13
库时实际文件的名称.
同时,在编译器要求使用一个共享库时使用的名字称为linker name,一般都是去掉版本号的soname,用于gcc中-lname这样的选项的编译.
这几个名字的关系:你在创建实际库文件中指定libreadline.so.3.0为real name ,并且使用符号链接创建soname ->libreadline.so.3和linker name-> /usr/lib/libreadline.so.
放置位置:
GNU标准推荐将所有默认的库安装在/usr/local/lib,这指的是开发者源代码默认的位置.
FHS指出大多数的库文件应该放在/usr/lib,而启动所需的库则应该放在/lib中,而非系统库应该放在/usr/local/lib.这指的是发行版默认的位置,这两个标准并没有矛盾.
共享库的主要有三个步骤:

创建目标代码.
创建库.
使用符号链接创建默认版本的共享库(可选).
现在我们举个例子来说明,我们编译源代码,使用-fPIC选项生成共享库所需的位置独立代码(position-independent code (PIC)):

gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ gcc -Wall -fPIC -c *.c
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ls
ctest1.c ctest1.o ctest2.c ctest2.o prog.c prog.o

然后我们创建库文件:

gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ls
ctest1.c ctest1.o ctest2.c ctest2.o libctest.so.1.0 prog.c prog.o

-shared选项指明生成共享目标文件,-W1(注意是小写L而不是一)指明传入链接器的参数,在此我们设定了该库的soname为libctest.so.1,-o则指明了生成的目标库文件为libctest.so.1.0(这个就是real name).

创建所需的符号链接:

gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ sudo mv libctest.so.1.0 /usr/local/lib/libctest.so.1.0
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ sudo ln -sf /usr/local/lib/libctest.so.1.0 /usr/local/lib/libctest.so.1
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ sudo ln -sf /usr/local/lib/libctest.so.1.0 /usr/local/lib/libctest.so

创建的libctest.so就是上面所谓linker name,用于编译时-lctest选项.

创建的libctest.so.1就是soname,我们在上边说过程序在运行时需要这个名字的符号链接.

此时我们的共享库就建好了,接着我们编译程序:

gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ gcc -Wall -L/usr/local/lib prog.c -lctest -o prog
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ls
ctest1.c ctest1.o ctest2.c ctest2.o prog prog.c prog.o

我们编译完毕,该库并不会包含在可执行文件中,只有在执行时来会动态加载进来.我们可以通过ldd列出一个可执行程序所有的依赖,在我的系统中还找不到/usr/local/bin的路径:

gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ldd prog
linux-gate.so.1 => (0x00a5c000)
libctest.so.1 => not found
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a6f000)
/lib/ld-linux.so.2 (0x00451000)

此时,运行会报找不到库的错误:

gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ./prog
./prog: error while loading shared libraries: libctest.so.1: cannot open shared object file: No such file or directory

我们可以将所需库的路径加入到系统路径中,有三种方法可以完成:

A.在/etc/ld.so.conf中加入所在路径,然后执行ldconfig配置链接器运行时绑定配置.你也可以创建一个文件,将路径写入,然后使用ldconfig –f filename将配置写入.
B.修改LD_LIBRARY_PATH环境变量(Linux下,AIX下为LIBPATH),在其中添加路径.若你直接在.bashrc文件中配置

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号