linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf 或者

使用-R选项)

今天下午尝试使用libosip2,安装比较简单,按照自带的help文档里面的操作进行即可。

$>mkdir linux-build

$>cd linux-build

$>../libosip2-2.2.0/configure

$>make  (最后2步要在管理员权限下执行)

# make install

完成之后,会在/usr/local/lib路径下生成一些lioosipXXX.so的文件,在/usr/local/include下生成关于osip的头文件。

为了测试安装是否正确,在eclipse下建了个测试项目,写了很简单的代码:

#include

//不加的话,编译时会报错,可能osip依赖于time.h

#include

//之所以能找到/usr/local/include下关于osip的头文件,是因为eclipse默认把/usr/local/include

放到Include directories里面了。在eclipse的项目属性-->C++

General-->Path and symbols

-->Include里面可以看到。如果自己写makefile文件的话,要加上-I

选项,表示程序里include的头文件去哪里找。参见

#include

using namespace std;

int main()

{

int i;

osip_t *osip;

i = osip_init(&osip);

if(i != 0)

cout << "error"

<< endl;

cout << "ok"

<< endl;

return 0;

}

并且在eclipse的项目属性-->C/C++

Build-->Settings-->Tool

settings-->GCC C++

Linker-->Libraries加上-lpthread -losip2的选项。

编译链接都没有问题,运行时报错:

error while loading shared libraries: libosip2.so.4: cannot open

shared object file: No such file or directory

然后查到可能是因为共享库设置的问题:

下面的几段是转载的,看了之后明白linux怎么找到共享库的

===========================================================================================

Linux 运行的时候,是如何管理共享库(*.so)的?在 Linux 下面,共享库的寻找和加载是由 /lib/ld.so

实现的。 ld.so 在标准路经(/lib, /usr/lib) 中寻找应用程序用到的共享库。

但是,如果需要用到的共享库在非标准路经,ld.so 怎么找到它呢?

目前,Linux 通用的做法是将非标准路经加入 /etc/ld.so.conf,然后运行 ldconfig 生成

/etc/ld.so.cache。 ld.so 加载共享库的时候,会从 ld.so.cache 查找。

传统上,Linux 的先辈 Unix 还有一个环境变量:LD_LIBRARY_PATH 来处理非标准路经的共享库。ld.so

加载共享库的时候,也会查找这个变量所设置的路经。

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib

export LD_LIBRARY_PATH

但是,有不少声音主张要避免使用 LD_LIBRARY_PATH 变量,尤其是作为全局变量。这些声音是:

* LD_LIBRARY_PATH is not the answer -

http://prefetch.net/articles/linkers.badldlibrary.html

* Why LD_LIBRARY_PATH is bad -

http://xahlee.org/UnixResource_dir/_/ldpath.html

* LD_LIBRARY_PATH - just say no -

http://blogs.sun.com/rie/date/20040710

解决这一问题的另一方法是在编译的时候通过 -R 选项指定

run-time path。

1.

往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到

2.

想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到。

比如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下

面,这时就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的

library才能在程序运行时被找到。

3.

如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变

量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时

候使用。

4. ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。

5.

总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。

LD_LIBRARY_PATH

这个环境变量是大家最为熟悉的,它告诉loader:在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。在linux下,还

提供了另外一种方式来完成同样的功能,你可以把这些目录加到/etc/ld.so.conf中,然后调用ldconfig。当然,这是系统范围内全局有效

的,而环境变量只对当前shell有效。按照惯例,除非你用上述方式指明,loader是不会在当前目录下去找共享库的,正如shell不会在当前目前找

可执行文件一样。

================================================================================================

在shell下尝试设置LD_LIBRARY_PATH,以下面这种形式设置,老是报错bash: LD_LIBRARY_PATH:

command not found,

LD_LIBRARY_PATH=/usr/local/lib

LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/usr/local/lib

可能是因为系统之前没有设置过LD_LIBRARY_PATH,于是改成这样:

export LD_LIBRARY_PATH=/usr/local/lib

然后用 echo $LD_LIBRARY_PATH检查一下是否真的设置成功,发现可以。

接着在该shell下运行eclipse生成的可执行文件,没有错误。

另外,如果不想每次新启一个shell都设置LD_LIBRARY_PATH,可以编辑~/.bash_profile文件:

$ vi ~/.bash_profile

添加:

LD_LIBRARY_PATH=/usr/local/lib

export LD_LIBRARY_PATH

这两行,完成之后.bash_profile如下所示:

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

LD_LIBRARY_PATH=/usr/local/lib

export PATH

export LD_LIBRARY_PATH

然后运行

$ source ~/.bash_profile 就行了。

-----------------------------------------------------------

前些天在配置通过OCI的方式连接Oracle中曾进碰到一个关于“java.lang.UnsatisfiedLinkError: no

XXX in java.library.path”这么一个问题,这个问题纠结了许久才解决,解决方式参考前面的文章。

趁双休日好好的理解一下产生这个问题的来龙去脉。

先看一段话先:

PATH is the environment variable.

java.library.path is the system properties.

When the java application started, JVM will set java.library.path’s

value using PATH’s value.

In java program, it’s very difficult to get the value of

environment variables, but it’s very easy to get/set system

properties. Use

System.getProperty(”project_root”, “..”);

System.setProperty(”project_root”, “..”);

java.libaray.path 是system

properties,在windows系统通常是使用PATH的值,而在Linux上是用LD_LIBRARY_PATH的值。

随便也说一下java.class.path,他是对应于CLASSPATH中的值。

那LD_LIBRARY_PATH的值主要是干什么呢?他是来处理非标准路径下的”共享库“的,可以理解成windows

的dll,但在linux下是*.so的文件。

说完了基本的概念,再来看看OCI是怎么连接Oracle的,其实OCI是通过JNI(java native

interface)的方式来访问Oracle的,请看下图

1)我们知道Oracle的驱动是classes12.jar(ojdbc14.jar),这里应该对应着java-class;

2) 同样我们在JBOSS启动脚本中设置 JBOSS_NATIVE_DIR=”/opt/instantclient_10_2″,其实就是将LD_LIBRARY_PATH=”/opt

/instantclient_10_2″,而在这个目录下有大量的*.so文件,这些应该对应native;

3)至于jni-stub是一些存根文件,可以参考一下JNI相关的说明,这里就暂不描述了(有时间可以再深入学习)。

本文出自 “蚂蚁神相”

博客,转载请与作者联系!

但是在安装BDB后,设置完LD_LIBRARY_PATH到bdb的lib目录后,用java访问还是一直报no db_java-so

in java.library.path,没有办法最后只好在启动java程序时加上

-Djava.library.path=/usr/local/BerkeleyDB.4.7/lib

才访问成功,可能与我的类加载机制有问题吧(自己做的类加载)。

linux java.library.path,linux LD_LIBRARY_PATH环境变量相关推荐

  1. linux java.library.path,设置java.library.path的值(Mac/Linux/Windows)

    说明:网上基本针对这个值的设置分为两面,Windows派和Linux派,Windows的不说,Linux下只会说设置LD_LIBRARY_PATH即可,但这种方式在Java 8是一个错误的设置,尤其是 ...

  2. linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf)

    linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf) 转载于:https://www.cnblogs.com/RichardLee/archiv ...

  3. java.library.path和LD_LIBRARY_PATH的介绍与区别

    背景 近期要将算法部署到一个机群的虚拟主机(Debian 9.1 gcc 6.3.0)上,采用的是Java + JNI + shared library的方式来完成底层算法能力的部署. 其中需要用到各 ...

  4. linux 设置 java.library.path,Linux下修改java.library.path-Go语言中文社区

    第一步:打印出当前的java.library.path有哪些目录: 执行  vi  Test.java 切换编辑模式  i 插入如下代码: public class Test { public sta ...

  5. linux LD_LIBRARY_PATH环境变量

    linux LD_LIBRARY_PATH环境变量 (2011-09-22 17:59:35) 转载▼ 标签: 杂谈 分类:技术文章 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 ...

  6. linux java sys paths,不同系统与程序修改java.library.path的位置(转)

    Linux环境 系统变量LD_LIBRARY_PATH来添加Java.library.path Windows 在系统->高级系统设置->环境变量里,在path变量里添加. Eclipse ...

  7. Linux 执行文件 path,linux可执行文件添加到PATH环境变量的方法

    linux命令行下面执行某个命令的时候,首先保证该命令是否存在,若存在,但输入命令的时候若仍提示:command not found 这个时候就的查看PATH环境变量的设置了,当前命令是否存在于PAT ...

  8. Linux下修改java.library.path

    第一步:打印出当前的java.library.path有哪些目录: 执行  vi  Test.java 切换编辑模式  i 插入如下代码: public class Test {public stat ...

  9. linux nd4j启动,ubuntu no nd4jcpu in java.library.path

    =============================================================================== 解决方法:I had the same ...

最新文章

  1. java pca资料整理
  2. action与servlet用法区别
  3. 自己定义九宫格手势解锁
  4. MPEG的完整形式是什么?
  5. linux的硬件系统管理,Linux 系统硬件管理的基础知识(四)
  6. oracle实验四运动会,实验四oracle的安全性和完整性控制
  7. linux和android学习,android学习笔记
  8. eclipse java 注释_Eclipse Java注释模板设置详解
  9. file对象怎样获取文件的长度?_使用FSO对象获取整个文件夹的信息
  10. PropertyGrid 绑定动态的属性与值的集合
  11. 杂谈(23)也说高考
  12. android小游戏代码
  13. 【QT】信号和槽机制
  14. MATLAB零基础入门教程视频课程
  15. DLT - Diagnostic Log and Trace简介
  16. 高客单价项目,适合新手操作的网络项目
  17. ruoyi-ui下载依赖报错npm ERR! cb() never called!
  18. 微信vue路由跳转兼容_Vue微信公众号开发踩坑记录
  19. 用c语言实现cyk算法,从CYK算法(自然语言处理)生成解析树的步骤
  20. WiFi模块(ESP8266)获取时间、天气API AT指令串口调试

热门文章

  1. 制作三星I9088 刷机ROM的实践(五)
  2. 因搜包耽误员工下班,苹果被判赔 2 亿!
  3. 各银行员工的月薪涨幅趋势
  4. Java Serialized 序列化 作用
  5. AXI三种接口及DMA DDR XDMA介绍(应用于vivado中的ip调用)
  6. 关于WINSERVER 2008 R2 FTP搭建心得
  7. 100个python算法超详细讲解:矩阵转置
  8. 在 Flutter 中实现一个浮动导航栏
  9. 【模拟】阿里郎(jzoj 2012)
  10. 首届盘古石杯全国电子数据取证大赛 技能赛晋级赛 2023年奇安信取证比赛题目