(更新1)ubuntu下的动态链接库(.so )问题(以opencv为例)

首先需要指出,如果你的shell已经是root管理情况,那就直接按照转载的方法执行就可以了。

如果你是非root的正常访问模式,那就在执行每一条指令的最开始加入sudo,以下为非root模式。

例如,需要配置opencv的动态链接库,那首先打开目录

cd /etc/ld.so.conf

然后,新建一个名为opencv.conf的文件,并在文件里添加你所安装的opencv的动态库绝对路径,可以是多个路径

sudo gedit opencv.conf

如果你没有安装gedit请先安装,如果你在该路径下没有opencv.conf文件,上一条指令会直接新建,有的话就会直接用gedit打开。打开后,在里面添加路径并保存(Ctrl+s),注意是绝对路径

/usr/lib

/XX/XX/XX/lib

这里/XX/XX/XX/lib表示任意的路径。最后,在shell中执行sudo ldconfig即可

除此之外,还有一种方法,就是在你需要执行指令的终端shell里加入临时的环境变量,例如
export LD_LIBRARY_PATH=/home/xxx/artoolkitx-master/Source/depends/linux/lib:$LD_LIBRARY_PATH
ldconfig
其中$LD_LIBRARY_PATH表示你已经有的库路径,冒号:是分隔符,/home/xxx/artoolkitx-master/Source/depends/linux/lib表示你现在需要的路径。之后,我们可以通过echo $LD_LIBRARY_PATH来查看当前的环境变量,千万记住,这个只是临时的,意味着你以后要用的任何时候,只要开启了新的终端,就必须重新添加一次.

以上做法,只是临时设置变量 LD_LIBRARY_PATH ,下次开机,一切设置将不复存在;把这个值持续写到 LD_LIBRARY_PATH 里可以在 ~/.bashrc 或者 ~/.bash_profile 中加入 export 语句,前者在每次登陆和每次打开 shell 都读取一次,后者只在登陆时读取一次。加到 ~/.bashrc 中,在该文件的未尾,可采用如下语句来使设置生效:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
修改完后,记得关掉当前终端并重新打开一个新的终端,从而使上面的配置生效。
不过这个环境变量是基于shell的,也就是说只有在当前设置了的shell里才会有作用,因此每次打开新的shell运行程序不停地设置LD_LIBRARY_PATH,是一件非常麻烦的事情,所以我们就会想有不有什么一劳永逸地方法,使得设置之后就不用再去设置了?答案是肯定的,即在~/目录下打开.bash_profile文件,设置环境变量如下:
LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

LD_LIBRARY_PATH  这个环境变量是大家最为熟悉的,它告诉loader:在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。在linux下,还 提供了另外一种方式来完成同样的功能,你可以把这些目录加到/etc/ld.so.conf中,然后调用ldconfig。当然,这是系统范围内全局有效 的,而环境变量只对当前shell有效。按照惯例,除非你用上述方式指明,loader是不会在当前目录下去找共享库的,正如shell不会在当前目前找 可执行文件一样。



------------------------------------------------------------------以下为转载内容----------------------------------------------------------------------------

一、库文件的搜索路径:

1、在配置文件/etc/ld.so.conf中指定动态库搜索路径(需要添加其它库文件的路径,在文件的最后添加具体的路径即可 [ 如:/usr/local/lib ],添加后保存退出,然后在命令行ldconfig

2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)

3、在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。 这是通过gcc 的参数"-Wl,-rpath,"指定,当指定多个动态库搜索路径时,路径之间用冒号":"分隔)

4、默认的动态库搜索路径/lib

5、默认的动态库搜索路径/usr/lib

搜索的先后顺序是:

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

二、Shell可执行程序命令文件搜索路径:

1.查看所有的搜索路径:echo $PATH

2.添加新的路径:

1)只对当前shell窗口有效:

export PATH=$PATH:/new path

2)对所有窗口有效:

修改当前用户的.bash_profile文件,在PATH=$PATH……后添加":/new path";

保存退出后,需要在当前窗口中执行". .bash_profile",更新配置,之后用echo $PATH显示更新后的路径,可以看到新加入的路径;

注意:在重新登录前所有新打开的shell窗口要用到新的路径都需要执行". .bash_profile",更新配置,因为.bash_profile文件的内容在用户登录时就读取了

转至点击打开链接


猜你喜欢

转载自blog.csdn.net/lyx_323/article/details/80763827