Linux下编译动态链接库

 

由于动态链接库函数的共享特性,它们不会被拷贝到可执行文件中。在编译的时候,编译器只会做一些函数名之类的检查。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须实用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址不无关代码(Position Independent Code (PIC))。

对gcc编译器,只需添加上 -fPIC 标签,如:
gcc -fPIC -c file1.c
gcc -fPIC -c file2.c
gcc –shared -o libxxx.so file1.o file2.o

注意到最后一行,-shared 标签告诉编译器这是要建立动态链接库。这与静态链接库的建立很不一样,后者用的是 ar 命令。也注意到,动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so”

四、动态链接库的使用

使用动态链接库,首先需要在编译期间让编译器检查一些语法与定义。

这与静态库的实用基本一样,用的是 -Lpath 和 -lxxx 标签。如:

gcc file1.o file2.o -Lpath -lxxx -o program.exe

编译器会先在path文件夹下搜索libxxx.so文件,如果没有找到,继续搜索libxxx.a(静态库)。

 

选项的意义:

      -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

l       -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

l       -L.:表示要连接的库在当前目录中

l       -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

l       LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

 

 

链接方法I,拷贝到系统库里再链接,让gcc自己查找

$ sudo cp lib***.so /usr/lib  

 

链接方法II,手动指定库路径

gcc file1.o file2.o -Lpath -lxxx -o program.exe

 

链接方法III,修改环境变量

$ export LD_LIBRARY_PATH=/path/to/lib

 

$ ldd test

执行test,可以看到它是如何调用动态库中的函数的。

Ldd:判断某个可执行的 binary 档案里有什么动态函式库:

 

比静态链接的程序多了一个 lib***.so ?恩,这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。

 

ldconfig和etc/ld.so.conf:将动态凼式库加载高速缓存当中:

首先,我们必须要在 /etc/ld.so.conf 里面写下『 想要读入高速缓存当中的动态凼式库所在的目录』,接下来则是利用 ldconfig 这个执行档将 /etc/ld.so.conf 的资料读入快取当中;

 

当执行函数动态链接.so时,如果此文件不在缺省目录下‘/usr/local/lib’ and ‘/usr/lib’.   那么就需要指定环境变量LD_LIBRARY_PATH:该环境变量主要用于指定查找动态链接库时除了默认路径之外的其他路径。(该路径在默认路径之前查找)

假如现在需要在已有的环境变量上添加新的路径名,则采用如下方式

LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路径串)

 

在linux终端下输入:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/au1200_rm/build_tools/bin

然后再输入:export,即会显示是否设置正确

多个路径之间用冒号分隔;例如:

# export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"

 

 

而PATH是执行文件路径的变量

PATH=${PATH}:add_yours

export PATH=${PATH}:add_yours

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值