解决linux .so的链接时符号依赖问题

问题描述

target: a.out

SO:libmyfile.so

依赖描述

a.out: libmyfile.so

libmyfile.so:  libssl.so.1.0.0

libssl.so.1.0.0: libcrypto.so.1.0.0

由于make参数的问题,表现为在生成a.out的时候,报错myfile.so有引用了未定义符号找不到,而该符号是出现在libcrypto.so.1.0.0中;

可疑方案

指定-L参数,然后分别把ssl,crypto的依赖项以-l参数加入make;编译成功;

疑问:

从依赖关系可见,明明我的生成目标是依赖libmyfile.so的,与libmyfile.so的依赖项的关系应该是透明的。为什么需要加到本层目标的参数项中来;

正规方法

仔细检视报错信息会发现,这是ld报错,ld指示可用-rpath指定库加载目录;

因此,我们应该在生成a.out目标时,除了加上libmyfile.so的依赖以及库搜索目录,还应该为ld指定库加载时依赖项的路径;

很简单,把so置于同一目录下,在生成可执行目标时,指定-rpath参数;这样就ld自动搜索依赖项了

时间: 2024-10-13 20:07:30

解决linux .so的链接时符号依赖问题的相关文章

如何解决linux下apache启动时httpd: apr_sockaddr_info_get() failed for 报错

今天在家里的RHLE5.5上安装apache的时候,先用user1用户./configure命令配置,然后才用root用户make && make install,结果apache起来的时候就报如下错误: httpd: apr_sockaddr_info_get() failed for bogon httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 fo

静态库链接时的依赖关系和先后顺序

1 静态库链接时的依赖关系 静态库之间是有依赖关系的,比如A.lib依赖于B.lib.C.lib.D.lib.E.lib,因为A会使用B.C.D.E中的函数. 2 使用静态库时的先后顺序 是不是B.C.D.E一定要放在A的后面?或者说,如果自己依赖于某个库,那么自己就要放在这个库的后面? 如果是的话,为什么会这样?是所有的链接器都是这样的吗? MSVC++12.0编译器是不管这个顺序的,gcc的未知. 3 使用静态库时必须注意依赖关系 也就是说,要使用一个lib时,要把它依赖的所有的lib都加上

解决linux下部署科大讯飞时的版本过低问题

在将项目部 署到阿里云服务器之后,需要将科大讯飞SDK下的libmsc64.so依赖库文件上传至/usr/java/jdk1.8.0_121/jre/lib/amd64路径下 在Windows下(Eclipse里直接运行Tomcat)调用语音转文字接口没问题,但部署到阿里云Linux上后,只要调用语音转文字接口就会报错,报错代码如下: 一开始从上图红框中的地方找原因,走了很多弯路,后面看下面的错误代码,终于找到方向如下图 然后开始注意到GLIBC_2.15 not found,阅读该博客后htt

解决linux下创建用户时出现 Creating mailbox file: 文件已存在

原来linux下添加用户后,会在系统里自动加一个邮箱(系统邮箱),路径是:/var/spool/mail/用户名.      可以直接用命令#rm -rf /var/spool/mail/用户名      这样就可以再次添加同一名字的用户. 解决You have new mail in /var/spool/mail/root提示 终端远程登陆后经常提示You have new mail in /var/spool/mail/root 这个提示是LINUX会定时查看LINUX各种状态做汇总,每经

使用strace命令解决linux服务器依赖库问题

使用strace命令解决linux服务器依赖库问题 简单说明:strace的另一个用处是解决和动态库相关的问题.当对一个可执行文件运行ldd时,它会告诉你程序使用的动态库和找到动态库的位置.但是如果你正在使用一个比较老 的glibc版本(2.2或更早),你可能会有一个有bug的ldd程序,它可能会报告在一个目录下发现一个动态库,但是真正运行程序时动态连接程序 (/lib/ld-linux.so.2)却可能到另外一个目录去找动态连接库.这通常因为/etc/ld.so.conf和 /etc/ld.s

linux下安装Oracle时交换空间不足的解决方法

摘:linux下安装Oracle时交换空间不足的解决方法 linux上安装Oracle时交换空间不足的解决办法 增加交换空间有两种方法: 严格的说,在系统安装完后只有一种方法可以增加swap,那就是本文的第二种方法, 至于第一种方法应该是安装系统时设置交换区. 1.使用分区: 在安装OS时划分出专门的交换分区,空间大小要事先规划好,启动系统时自动进行mount. 这种方法只能在安装OS时设定,一旦设定好不容易改变,除非重装系统. 2.使用swapfile:(或者是整个空闲分区) 新建临时swap

解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题

解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题 解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题 有时候当用远程桌面链接某台Windows主机的时候会出现"The RPC server is unavailable."的问题,并在日志里还会看到如下图所示的错误: RPC 

linux上备份Oracle时EXP-00091的错误解决方法

unix/linux上备份Oracle时EXP-00091的错误解决方法 unix/linux上备份数据时的错误解决方法 EXP-00091: Exporting questionable statistics.解决方法 今日EXP数据发现如下错误: EXP-00091: Exporting questionable statistics. . . exporting table                     TAXVOU3129    2904185 rows exported EX

共享windows7网络时出现依赖的组件无法启动的解决办法

共享windows7网络时出现依赖的组件无法启动的解决办法. 一般说来是Remote Procedure Call (RPC).RPC Endpoint Mapper.Remote Procedure Call (RPC) Locator.SNMP Trap.Telephony.Remote Access Connection Manager.Remote Access Auto Connection Manager.Secure Socket Tunneling Protocol Servic