链接选项rpath,容易被忽略的一个功能

问题来源

最近在做一个项目的客户端的SDK,实现为一个动态链接库,其依赖于其他的若干个动态库文件。那么在利用SDK开发应用程序的时候,编译的时候除了链接SDK库本身,还得链接SDK库所依赖的库,这样编译命令里面得一一的添加这些库。

比如,SDK库的名称为liba.so, 其依赖于libb.so和libc.so,那么在编译应用程序的时候使用以下命令:

+++++++++++++++++++++++++++++++++++++++++++++

gcc -o test test.c -I. -L. -la -lb -lc

+++++++++++++++++++++++++++++++++++++++++++++

但是如果将SDK库即liba.so交给其他的开发人员,其他的开发人员可不想编译的时候,显示的链接liba.so所依赖的库。他们更愿意编译的时候,只显示地链接liba.so。

那么该怎么做呢?利用rpath这个链接选项!

解决方法

首先来man ld,查找链接选项rpath的含义:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-rpath dir

Add  a  directory to the runtime library search path.  This is used when linking an ELF executable with

shared objects.  All -rpath arguments are concatenated and passed to the  runtime  linker,  which  uses

them  to locate shared objects at runtime.  The -rpath option is also used when locating shared objects

which are needed by shared objects explicitly  included  in  the  link;  see  the  description  of  the

-rpath-link option.  If -rpath is not used when linking an ELF executable, the contents of the environ-

ment variable "LD_RUN_PATH" will be used if it is defined.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

简单翻译下, rpath链接选项主要有两个功能:

(1)程序运行时,优先到rpath指定的目录去寻找依赖库

(2)程序链接时,在指定的目录中,隐式的链接那些动态库所需要的链接库。

往往我们都熟知第一个功能,忽略第二个功能。而第二个功能正是现在所需要的。

我们将liba.so,libb.so 和 libc.so拷贝的同一个目录中,然后利用rpath链接应用程序,这样编译便不需要显示的去链接liba.so所依赖的库了。

+++++++++++++++++++++++++++++++++++++++++++++

gcc -o test test.c -I. -L. -la -Wl,-rpath=.

+++++++++++++++++++++++++++++++++++++++++++++

链接选项rpath,容易被忽略的一个功能

时间: 2024-11-25 10:25:54

链接选项rpath,容易被忽略的一个功能的相关文章

动态库的链接和链接选项-L,-rpath-link,-rpath

https://my.oschina.net/shelllife/blog/115958 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置.linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这两个目录,然后按照/etc/ld.so.conf里面的配置搜索绝对路径.同时,Linux也提供了环境变量LD_LIBRARY_PATH供用户选择使用,用户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.

Linux ToolChain (二) --- Linker (1)链接选项 -L -rpath -rpath-link

一.动态库的链接和链接选项-L,-rpath-link,-rpath (1). 现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开, 用户可以通过-L指定连接时库的路径, 通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性. Link-time path -L指定连接时库的路径 -L Run-time path -R(或-rpath)指定程序运行时库的路径 -rpath-link -rpath 比如我们做嵌入

微信点击图文消息链接 在根据判断跳到另一个页面 但是 点关闭 将当前的关闭之后 会出现空白页

<script> function ss() { var u = navigator.userAgent; if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {//安卓手机location.href = '2.html?id=3323/#wechat_redirect'; } else if (u.indexOf('iPhone') > -1) {//苹果手机location.href = '2.html?id

Fiddler快速入门(还有一个功能就是不经过网络,直接模拟一个响应返回给客户端)

Fiddler是一个免费.强大.跨平台的HTTP抓包工具.Wireshark也是一个强大的抓包工具,不过Wireshark是一个通用的抓包工具,主要精力放在各种协议上了,针对HTTP的特定功能较少.所以如果你需要研究HTTP包的话,Fiddler一定是最适合的工具. 下载和安装 我们可以到Fidller下载页面下载Fiddler.下载完成之后安装即可.安装之后,我们打开它,可以得到类似的用户界面.在Windows下可能需要管理员权限,允许即可. Fiddler Fiddler通过打开localh

面试角度分析:微信里面让你删掉一个功能,你选哪个?

作为产品面试题,让你砍掉一个功能显然不是为了看你的喜好或者让你猜微信下一个动作,而是要考察你的产品思维能力和市场敏锐度.如果你的回答是“我觉得应该砍掉XXX因为……”,那么恭喜你,你是个有意见的用户,而不是个产品负责人.另外很多面试者虽然想到了要使用数据调查等等方式来获取信息帮助自己做决定,在答题的最后却没有给出具体要砍哪个功能的答案.这个虽然好于凭感觉瞎猜,却也不是理想的回答,因为谁都知道面试过程中你没法做调查获取数据,给出充足的时间和资源任何人都有可能得到这些数据,但是现实本来就是区别于理想

如何基于WKWebView开发一个功能完善的资讯内容页

前言 对于资讯类的APP来说 良好的阅读体验是必不可少的, 那么如何去开发一个功能完善的资讯文章页面就是本文要说的重点.相信本文会对很多在做同类功能开发的道友们有很大的帮助 , 如果某只大佬路过也欢迎指点一二. 废话不多说 开讲(chui)~ 分析 数据 对于图文混排的富文本形式 , 最好最通用的数据格式当属 HTML , 再加上 CSS 和 JS 的配合, 可以随心所欲的展示出成百上千在不同的样式.当然 , 除了 HTML 也不排除有使用其他规则的数据格式来表示.但这里我们还是选择使用 HTM

Swifter.Json -- 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具。

Swifter.Json Github Wiki 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具. Swifter.Json 已经经过了大量测试和线上项目中运行许久来确保它的稳定性. 特性 1: 支持 .Net 上绝大多是的数据类型,且轻松扩展:包括但不限于:实体,字典,集合,迭代器,数据读取器和表格. 2: 支持 .Net 我已知的大多数平台,包括但不限于:.Net Framework 2.0+, .Net Core 2.0+, .Net St

写代码的思路之写一个功能的思路

如果让你实现一个功能,你要完成这个功能的一般思路是什么? 我是一位初学者,希望和大家共享下我在书写代码时的思路,希望对大家有帮助. 以下是我实现一个简单‘日历“这一功能的思路: 当我决定要做一个日历的时候,我会先制作一个”日历“模型,即要实现的”日历“的模型(样子),我用控件制作的: 之后我会按照”日历“模型上面的控件从上到下,从左到右依次声明,但先不实现: 之后一个控件一个控件实现,在设计控件的属性的时候是严格按照之前”日历“模型的属性,这会提高效率: 一个控件实现了之后要做一次测试,保证该控

一个功能更强大的函数,也是用正则表达式写的

<% Option Explicit Function stripHTML(strtext) dim arysplit,i,j, strOutput arysplit=split(strtext,"<") if len(arysplit(0))>0 then j=1 else j=0 for i=j to ubound(arysplit) if instr(arysplit(i),">") then arysplit(i)=mid(arysp