首页 > 系统相关 >linux动态库(.so)搜索路径(目录)设置方法

linux动态库(.so)搜索路径(目录)设置方法

时间:2022-12-20 21:22:05浏览次数:47  
标签:main 路径 搜索 linux cpp so 动态

 

https://blog.csdn.net/my_angle2016/article/details/121770237

 

{

 

在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可通过三种方法来指定:

方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径;

方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径;

方法三:在编译目标代码时指定该程序的动态库搜索路径。
众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动 态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。

方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。
vi /etc/ld.so.conf
添加 lib目录
ldconfig
方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
export LD_LIBRARY_PATH=”LD_LIBRARY_PATH:/opt/”
方法三:在编译目标代码时指定该程序的动态库搜索路径。
还可以在编译目标代码时指定程序的动态库搜索路径。通过gcc 的参数”-Wl,-rpath,”指定

其中方法三可以避免安装部署的麻烦

方法三示例

    假设main.cpp,hello.h,hello.cpp,其中main.cpp调用了hello类中的方法
     
    1 生成hello.so
     
      g++ -shared hello.cpp -o libhello.so
     
    2 编译main.cpp,并链接,并指定运行时libhello.so的位置
     
      g++ main.cpp -lhello -L./ -Wl,-rpath=./ -o main
     
     
     
    值得一提的是,如果采用带版本号的库,例如libhello.so.2
     
    链接命令可使用g++ main.cpp libhello.so.2 -L./ -Wl,-rpath=./ -o main

2)加入第二个so库

g++ main.cpp -L./second/ -Wl,-rpath=./second/ -lsecond -L./hello/ -Wl,-rpath=./hello/ -lhello  -o main

ps,遇到过一个奇怪的问题,就是假设libhello.so还用到了libother.so,由于在/etc/ld.so.conf里配置错误了libother.so的目录路径,导致一直产生undefined reference to错误,但是在工程里对libother目录路径配置是正确的,有可能于查找路径顺序有关

}

标签:main,路径,搜索,linux,cpp,so,动态
From: https://www.cnblogs.com/YZFHKMS-X/p/16995115.html

相关文章

  • 在linux上oracle服务启动停止详细
    在CentOS6.3下安装完Oracle10gR2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介绍一般而言如......
  • linux LO接口
    1、什么是LO接口?在LINUX系统中,除了网络接口eth0,还可以有别的接口,比如lo(本地环路接口)。环回地址lo是主机用于向自身发送通信的一个特殊地址(也就是一个特殊的目的地址)。本......
  • [ Linux ] 互斥量实现原理,线程安全
    上篇文章我们对抢票系统做了加锁处理,对互斥量tickets进行加锁。而本篇博文来谈谈互斥量实现的原理以及相关问题。1.上篇遗留问题我们在临界资源对应的临界区中加锁了,就不是......
  • Linux 系统结构
    来源:https://www.linuxprobe.com/linux-system-structure.html导读Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形......
  • linux操作系统的kill -9 和 kill -15 的区别
    在linux操作系统中,要杀死一个进程需要使用的命令是kill。1kill-9PID强制停掉进程,不给进程使用回调函数的机会,也不会等进程处理完手上的工作,对于已经进入生产环境的系......
  • Linux 利用 buildroot 移植 SSH
    0、Buildroot说明下载Buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一......
  • MySQL-SQL审计工具SOAR
    OAR (SQLOptimizerAndRewriter)是一个对SQL进行优化和改写的自动化工具。由小米人工智能与云平台的数据库团队开发与维护一、简介1、功能特点跨平台支持(支持L......
  • SpringBoot - @ImportResource,@ConfigurationProperties 让xml生效与类属性绑定配置文
    @ImportResource作用:使用.xml配置文件范围:必须使用在主程序@SpringBootApplication或配置类上@Configuration@SpringBootApplication@ImportResource("classpath:appl......
  • Linux下安装lr负载机
    负载代理下载地址load-generator链接:https://pan.baidu.com/s/1qcFNZXGdegzYJovOKgj2CA提取码:ed55安装环境系统:centos7最小安装版(CentOS-7-x86_64-Minimal-1503-01.iso)。......
  • Redisson实现分布式锁剖析
    Redission实现分布式锁:Redission是什么?Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-MemoryDataGrid),它充分利用了Redis键值数据库提供的一系列优势,基于J......