LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

可执行程序运行时使用指定目录下的动态库解决办法

2023年8月31日 157点热度

工作中有时会碰到可执行程序运行时使用指定目录下的动态库,若是直接更改环境变量,可能会对其他程序形成影响,因而可以在编译时使用-Wl,rpath来指定运行时路径。

例如/home/lib下存在libtest.so,/home/test下存在test.c和libtest.so文件linux创建用户并指定目录,编译出的可执行文件依赖动态库libtest.so


/home
|--lib
-libtest.so 
|--test
- test.c
- libtest.so 

假定想让可执行文件运行时使用lib下的动态库,可以使用如下命令

gcc -o test test.c -L./ libtest.so -Wl,-rpath='$ORIGIN/../lib'

其中-L./libtest.so表示编译时使用当前目录下的libtest.so进行编译

-Wl,-rpath='$ORIGIN/../lib'表示运行可执行文件时,从../lib中找寻所须要的动态库。

可以使用ldd命令查看可执行程序的依赖

# ldd test
libtest.so => /home/test/../lib/libtest.so

通过ldd命令可知,test运行时使用的动态库路径为/home/test/../lib

还有一种情况是可执行程序test使用的动态库为libtest.so而编译时使用的是libtest.so.1.1

例如目录就结构如下

/home
|--lib
-libtest.so.1.1 
|--test
- test.c
- libtest.so.1.1

编译生成可执行文件

gcc -o test test.c -L./ libtest.so.1.1 -Wl,-rpath='$ORIGIN/../lib' 

运行ldd时发觉找不到动态库libtest.so

# ldd test
libtest.so => not found 

缘由是运行test时他须要的动态库的名子为libtest.so而lib中储存的是libtest.so.1.1,名子不一样,因而找不到动态库。

解决办法

1、可以把lib下的libtest.so.1.1名子改为libtest.so

2、也可以在lib下创建一个libtest.so.1.1的软联接

# cd lib
# ln -s libtest.so.1.1 libtest.so
# ls
libtest.so libtest.so.1.1
# ldd test
libtest.so => /home/test/../lib/libtest.so

附:

我们编译程序时会经常碰到如下你几个参数

-I(小写的i)

-L(小写l)

-l(大写l)

接出来对这几个参数进行简单的讲解。

先举个反例:

gcc -o test test.c -I /home/test/include  -L/home/test/lib -ltest

编译test时:

-I/home/test/include表示将/home/test/include目录作为第一个找寻头文件的目录,其寻觅的次序是:

/home/test/include --> /usr/include --> /usr/local/include

-L/home/test/lib表示将/home/test/lib目录作为第一个找寻库文件的目录,其寻觅的次序是:

/home/test/lib --> /lib -> /usr/lib --> /usr/local/lib

-ltest表示在前面的lib的路径中找寻libtest.so动态库文件(假如gcc编译选项中加入了“-static”表示找寻libtest.a静态库文件),程序链接的库名是test。

-l参数就是拿来指定程序要链接的库,-l参数紧接着就是库名,那库名跟真正的库文件名有哪些关系呢?

例如物理库,他的库名是m,他的库文件名是libm.solinux系统,把库文件名的头lib和尾.so除去就是库名了。

例如当我们使用第三方提供的库名子叫libtest.so,这么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们能够用上libtest.so库了(其实要用libtest.so库里的函数,我们还须要与libtest.so配套的头文件)。

对于置于/lib和/usr/lib和/usr/local/lib里的库直接用-l参数能够链接了adobe air linux,但若果库文件没放到这三个目录里,而是放到其他目录里,若此时我们只用-l参数的话,链接还是会出错,出错信息大约是:

/usr/bin/ld: cannot find -lxx

也就是说链接程序ld在那3个目录里找不到libxx.solinux创建用户并指定目录,这个时侯另外一个参数-L就派上用场了。

例如我们使用test库它置于/usr/test/lib目录下,我们编译时就要用

-L/usr/test/lib-ltest参数,-L参数跟随的是库文件所在的目录名。

再例如我们把libtest.so置于/var/bbb目录下,那链接参数就是

-L/var/bbb -ltest

另外,大部份libxx.so只是一个链接,例如libm.so它链接到lib/libm.so.6,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,

假如没有这样的链接,我们运行可执行程序时可能还是会出错,由于ld只会找libxx.so。

所以假如你要用到xx库,而只有libxx.so.x或则libxx-x.x.x.so时,做一个软链接就可以了。

命令如下:

ln -s libxx-x.x.x.so libxx.so

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 出错 动态 参数 目录 链接
最后更新:2023年8月31日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
车市新战局:汽车操作系统会复制智能手机的历史吗? Linux文件系统种类 如何卸载用源码包安装的软件?在线视频教程推荐 「职位」ASP.、PHP、Linux服务器集群开发 Torvalds:Linux内核开发的创新前景充满了热情 Linux文件系统的结构从终端窗口探索Linux目录树结构 卸载软件命令Linux.You linux软件开发如何入门?学习Linux步骤及学习方法介绍 14年Linux发行版的有趣历史观点 Linux中不像Windows可以直接在控制面板中卸载? 2018年波及众多Linux发行版的性能对比会更加深入 如何用源码包安装的软件?name的方法总结 Linux之父李纳斯托瓦兹开发的Linux只是一个内核 Linux系统中的apt和apt-get的区别及解决办法! Linux系统发行版的一种方法,除此以外 MacM1上安装Docker和CentOS,您需要遵循的步骤 linux光驱启动怎么设置 常见的几种设置方法,你知道几个? 关于ESXi主机磁盘空间回收的具体操作步骤及步骤 Linux设置显示中文和设置字体设置中文一个都不能少 如何在Linux系统中使用命令查看Linux发行版版本信息
嵌入式Linux操作系统学习规划+LINUX路线,主攻江苏电信天翼校园客户端故障指引及解决办法(101)英特尔GMAGMA950显卡驱动程序/WIN8/8.1电信校园网宽带用USB数据线共享给电脑无线上网国防科大开源操作系统:它只是一个吉祥的象征10个常用Linux文本查看命令及其详细说明和使用示例Linux嵌入式系统内核裁剪与定制方法的介绍情况淘宝教育热卖C语言编程开发C++程序设计零基础入门课程从CPU、内存、硬盘、显卡等这些方面安装Linux系统的最低配置Linux通过chkconfig设置开机启动服务创建的几种常见方式(技术分析)Linux多线程的使用与操作系统的区别通常rar命令由一个主命令加若干选项(可选)构成RedHatLinux中自动运行程序中的应用linux 读写文件 关于Linux内核的神秘面纱,你知道几个?使用wget实用程序的有用命令行工具的使用怎么设置linux开机项自启动?方式是怎样的?嵌入式Linux应用层与驱动层要想学习关于Linux内核的交叉编译步骤和方法:步骤、方法STM32嵌入式linux开发流程及应用程序分析-STMlinux下有哪些文件在介绍lsof命令实用用法介绍?
如何本地运行远程系统上运行命令或程序(组图) 从单片机到嵌入式Linux的特点是软硬件可裁剪 PHP中计算两个日期之间相隔的长度最简单的方法 绪论:100小时定律已成,现今将之前所学知识温顾 Linux在未来服务器领域仍是大势所趋! 1%命令参考Linux命令大全:-1%的命令显示 服务器上安装linux系统的具体操作过程-如何选择系统? Linux档案的权限和详细说明与群组的详细介绍 TP-LINK全能无线网卡驱动分享 快速实例学习:修改某个目录下的所有文件的权限 virtualbox安装virtualbox增强功能,虚拟机下载 时间戳和时区1Unix(/)接收的两个推测 嵌入式Linux视频采集的设计方法和监控系统的处理 回到Linux基础系列之回到Shell系列文章大纲 如何管理Linux软件包软件包命名deb软件包的命名遵循以下约定 9种方法轻松获取Linux版本,快速掌握系统信息! Linux下程序的存放目录和安装目录 linux系统位数最简单的命令--linux 写入数据覆盖的分析与执行 Linux系统查看系统运行状态的top命令的功能
标签聚合
虚拟机 命令 文件目录 操作 linux系统 文件 应用 内核 软件 linux服务器
书籍
课程
技术群
技术干货大合集↓
  • 2023年9月 / 70篇
  • 2023年8月 / 93篇
  • 2023年7月 / 94篇
  • 2023年6月 / 90篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.