链接期和运行期的动态链接库

可执行文件在查找依赖的动态链接库时,是根据 /etc/ld.so.conf 和 $LD_LIBRARY_PATH 查找的。

所以,换了机器运行(如开发机和线上机),链接到的共享库可能不一致。

另外,链接期可以hard code所要链接的库的路径。这样,即使换了机器,运行期也会从hard code的路径去寻找库。


例子:

开发机上:

server.h

void fun();

server.c

#include <stdio.h>

void fun() {
  printf("server fun.");
}

server_2.c

#include <stdio.h>

void fun() {
  printf("server fun.");
  printf("server fun.");
  printf("server fun.");
  printf("server fun.");
  printf("server fun.");
  printf("server fun.\n");
}


test.c

#include "server.h"
#include "stdio.h"

int main() {
  fun();
}

命令:

gcc server.c -shared -fPIC -o libserver.so
gcc test.c -L. -lserver -o test
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"current_path"
./test
=====output: server fun.

将这些文件放到另外一台机器上

mv libserver_2.so libserver.so
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"current_path_on_this_machine"
./test
=====output:  server fun.server fun.server fun.server fun.server fun.server fun.

 另外,如果在编译test时使用libserver.so的绝对路径: 

gcc test.c current_path/libserver.so -o test
那么,另外一台机器上运行时,如果 current_path 和 current_path_on_this_machine 不同,则报错:

./test: error while loading shared libraries: current_path/libserver.so: cannot open shared object file: Permission denied



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值