动态链接库链接参数不要写成静态链接形式

70 篇文章 0 订阅

背景

动态链接库常用写法:
动态链接库的路径在/usr/local目录,动态链接库的名称为libtest.so,我们在链接的时候,一般使用
g++ -o test_bin main.o -L$(library_path) -ltest
类似这种形式来指定目标文件需要的动态链接库。

静态链接库的写法如下:
例如静态链接库放到/usr/local/libstatic.a,我们在链接的时候,一般使用
g++ -o test_bin main.o /usr/local/libstatic.a

意外

因为项目中的某些原因,自己的静态链接库,修改成了动态链接库的方式,因此,为了省事,试了一下是否可以使用动态链接库链接的时候,也用静态链接的形式进行链接,试了一下完全OK,没问题。于是就这么用起来了。如下:
g++ -o test_bin main.o /usr/local/libtest.so

运行时

正常情况下,在本机的环境下,这样跑起来没有问题。但是,一旦运行到非本机目录环境,则出现了问题。
当迁移到另一台机器的时候,如果/usr/local目录下没有libtest.so文件,则启动的时候,一直报错。提示:cannot open shared object file: No such file or directory
按照一般经验,把对应的so移到运行的机器上,找个非原来编绎对应的so目录下,例如:/tmp目录下放着libtest.so文件。把环境变量LD_LIBRARY_PATH加上,此时无效!错误一直提示为:找不到/usr/local/libtest.so,因为编绎的时候,直接把动态链接库的路径写死了!

解决方案

动态链接库的写法,一定不能通过定动态链接库的绝对路径+文件名的方式,因为运行时,可执行程序需要到对应的目录下去找动态链接库并加载,而静态链接库,则是把对应的实现直接复制到了可执行程序BIN文件中,运行的时候不会再依赖对应的静态链接,所以写法不同。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值