LD_LIBRARY_PATH详解,从此不害怕安装C语言源代码软件(欢迎海南大学的51粉丝)
今天的推文稍微有点不一样,生信技能树/菜鸟团的铁粉都知道我们的推文都是纯粹的知识分享,几乎不发二维码,我大学同学在学院开讲座想普及一下生物信息学知识顺便宣传一下我这里的工作,发现找不到我们的二维码,所以亲自给我做了一个宣传图,并且带来了51个学弟学妹粉丝,欢迎你们!
下面是正文:
我在B站上面讲解过软件安装全集,其实是怕新手还没入门就放弃,所以只是简单分类,然后强调大家尽量不要碰C源代码软件,能conda就conda,实在不行找二进制可执行程序:
其实,C源代码的确是有点难度,但是掌握了LD_LIBRARY_PATH概念就还好了,下面我就简单介绍一下:
LD_LIBRARY_PATH
是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。
非常多的软件没有root权限安装会比较困难,主要就是因为各种系统库文件,也就是LD_LIBRARY_PATH
这个环境变量里面的文件。比如前面我提到的lancet软件需要的库文件如下:
-llzma -lbz2 -lz -ldl -lpthread -lcurl -lcrypto -lbamtools
可以使用 ls /usr/lib |grep lib
查看自己是否有需要的库文件,当然还需查看其它库文件目录:echo $LD_LIBRARY_PATH
里面一般可以看到七八个已经定义好的库文件搜索路径。
当执行函数动态链接.so时,如果此文件不在缺省目录下 /lib和/usr/lib,那么就需要指定环境变量LD_LIBRARY_PATH
假如现在需要在已有的环境变量上添加新的路径名,则采用如下方式: LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH
(newdirs是新的路径串), 实例如下;
cpp export LD_LIBRARY_PATH=/export/apps/anaconda2/2.4.1/lib/:$LD_LIBRARY_PATH ¨G1G /usr/bin/ld: cannot find -llzma collect2: error: ld returned 1 exit status make[1]: *** [lancet] Error 1 make[1]: Leaving directory `/home/jianmingzeng/biosoft/lancet/lancet/src' cp: cannot stat `lancet': No such file or directory ¨G2G shell gcc -llzma --verbose ¨G3G locate liblzma /export/apps/anaconda2/2.4.1/lib/liblzma.a /export/apps/anaconda2/2.4.1/lib/liblzma.la /export/apps/anaconda2/2.4.1/lib/liblzma.so /export/apps/anaconda2/2.4.1/lib/liblzma.so.5 /export/apps/anaconda2/2.4.1/lib/liblzma.so.5.0.5 ¨G4G export LD_LIBRARY_PATH=/export/apps/anaconda2/4.0.0/lib/:$LD_LIBRARY_PATH export LIBRARY_PATH=/export/apps/anaconda2/4.0.0/lib/:$LIBRARY_PATH
为什么修改LD_LIBRARY_PATH呢
因为运行时动态库的搜索路径的先后顺序是:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH
指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib和/usr/lib;
这个顺序是compile gcc时写在程序内的,通常软件源代码自带的动态库不会太多,而我们的/lib和/usr/lib只有root权限才可以修改,而且配置文件/etc/ld.so.conf也是root的事情,我们只好对LD_LIBRARY_PATH
进行操作啦。
永久性添加
每次我使用该软件都需要临时修改库文件,因为上面的方法是临时设置环境变量 LD_LIBRARY_PATH ,重启或打开新的 Shell 之后,一切设置将不复存在。
为了让这种方法更完美一些,可以将该 LD_LIBRARY_PATH
的 export
语句写到系统文件中,例如 /etc/profile
、/etc/export
、~/.bashrc
或者 ~/.bash_profile
等等,取决于你正在使用的操作系统咯。