图片 17

网站首页

编译错误,动态库的后缀为

17 7月 , 2019  

因为品种需求动用MP3Box给录像文件加hint,所以需求在在陆拾六位SUSE
Linux下编译gpac。
原来在叁拾壹个人系统上./configure make
没啥难题,结果晌午换了个61人的机器死活编写翻译可是,报如下错误:

Linux系统中“动态库”和“静态库”那点事情 /etc/ld.so.conf
 动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名

Apache2.40+OpenSSL1.0.1i 编译错误化解进度记录。

s.opic -lm -L/usr/local/lib  -lz -ljpeg -lpthread -ldl
/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/bin/ld:
/usr/local/lib/libz.a(gzio.o): relocation R_X86_64_32 against `a
local symbol’ can not be used when making a shared object; recompile
with -fPIC
/usr/local/lib/libz.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[1]: *** [libgpac.so] Error 1
make[1]: Leaving directory `/root/mayl/bin/gpac/src’
make: *** [lib] Error 2
xmidc_dm_nrc1:~/mayl/bin/gpac #

转载自:

[root@linuxidc httpd-2.4.10]# uname -a

经过反复检查评定排错,开采链接的时候使用了30人的libz去链接,导致函数地址找不到,链接不成事。
后修改src/Makefile底下的
EXTRALIBS+=-L$(prefix)/lib
改成
EXTRALIBS+=-L$(prefix)/lib64后解决。

 

Linux linuxidc 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC
2013 x86_64 x86_64 x86_64 GNU/Linux

PS:

明日我们主要来讲说Linux系统下基于动态库(.so)和静态(.a)的次序那多少个猫腻。在那前边,大家须要驾驭一下源代码到可试行程序之间究竟发生了如何奇妙而特出的事情。
在Linux操作系统中,广泛运用ELF格式作为可施行程序恐怕程序生成进度中的中间格式。ELF(Executable
and Linking
Format,可试行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接口(Application
BinaryInterface,ABI)而支出和文告的
。工具接口规范委员会(TIS)选拔了正在升高中的ELF标准作为专门的学问在叁拾二位AMD种类上不相同操作系统之间可移植的二进制文件格式。本文不对ELF文件格式及其构成做太多解释,避防冲淡本文的主旨,大家假设通晓这么个概念就行。现在再详解Linux中的ELF格式。源代码到可推行程序的转变时要求经验如下图所示的进度:

[root@linuxidc httpd-2.4.10]# uname -r

GPAC 是二个为科学商量和学术圈子支出的多媒体的框架,协理 MPEG-4, VRML, X3D,
SVG, LASe智跑 等

Win9x和Win NT/3000/XP下的32个人的可奉行文件PE(Portable
Executable:可活动的可实践文件)

2.6.32-431.el6.x86_64

GPAC 满含贰个多媒体播放器 Osmo4 以及多媒体打包工具 MP5博克斯

图片 1

[root@linuxidc httpd-2.4.10]#

GPAC is cross-platform. It is written in (almost 100% ANSI) C for
portability reasons (embedded platforms and DSPs), attempting to keep
the memory footprint as low as possible. It is currently running under
Windows, Linux, WindowsCE (SmartPhone, PocketPC 2002/2003), Embedded
Linux (familiar 8, GPE) and recent SymbianOS systems.

l
编写翻译是指把用高等语言编写的程序调换来相应管理器的汇编语言程序的进度。从精神上讲,编写翻译是多少个文书转变的历程。对嵌入式系统来讲,一般要把用C语言编写的程序调换到Computer的汇编代码。编写翻译进程富含了C语言的语法分析和汇编码的浮动五个步骤。编写翻译一般是种种文件进行的,对于每三个C语言编写的文本,大概还索要开始展览预管理。
l
汇编是从汇编语言程序生成目的系列的二进制代码(机器代码)的经过。机器代码的浮动和管理器有紧凑的关系。相对于编写翻译进度的语法解析,汇编的长河绝对简便易行。那是因为对此一款特定的Computer,其汇编语言和二进制的机器代码是各种对应的。汇编进程的输入是汇编代码,那几个汇编代码恐怕源于编写翻译进程的出口,也足以是一贯用汇编语言书写的次序。
l
连接是指将汇编生成的多段机器代码组合成多个可实施程序。一般的话,通过编写翻译和汇编进度,每二个源文件将生成三个目的文件。连接器的成效正是将那一个目的文件组合起来,组合的进度满含了代码段、数据段等部分的合併,以及丰盛相应的文件头。
GCC是Linux下第一的次第生成工具,它除了编写翻译器、汇编器、连接器外,还富含一些扶助理工科程师具。在底下的辨析进度中小编会教大家那些工具的着力选用格局,Linux的雄强之处在于,对于不太懂的一声令下或函数,有二个很强劲的“男生”时刻stand
by your side,有怎样不会的就去命令行终端输入:man
[指令名或函数名],然后阿拉神灯就能显灵了。
对此最终编写翻译出来的可推行程序,当大家推行它的时候,操作系统又是什么反馈的啊?大家先从微观上来个一体化把握,如图2所示:

64为CentOS 6.5版本,
编译Apache2.40时出错

图片 2

图片 3

Apache编写翻译选项:

用作UNIX操作系统的一种,Linux的操作系统提供了一几种的接口,这几个接口被誉为系统调用(System
Call)。在UNIX的视角中,系统调用”提供的是体制,而不是战略”。C语言的库函数通过调用系统调用来贯彻,库函数对上层提供了C语言库文件的接口。在行使程序层,通过调用C语言库函数和系统调用来促成效果与利益。一般的话,应用程序好多选择C语言库函数落成其意义,相当少使用系统调用。
那正是说最后的可施行文件到底是怎样样子吧?前边早就说过,这里大家不深切分析ELF文件的格式,只是给出它的多少个结构图和部分粗略的证实,以便于大家清楚。
ELF文件格式包涵三种关键的类别:可推行文件、目的文件、分享库。
1.可推行文件(应用程序)
可推行文件满含了代码和数量,是足以一贯运营的顺序。
2.目的文件(*.o)
可重定向文件又称为目的文件,它含有了代码和数码(这个多少是和别的重一向文件和共享的object文件一同接二连三时行使的)。
*.o文件参预程序的接连(创造三个程序)和程序的施行(运营一个顺序),它提供了一个便于实用的格局来用并行的观念看待文件的剧情,那一个*.o文件的移位得以呈现出分裂的内需。
Linux下,大家得以用gcc -c编写翻译源文件时可将其编写翻译成*.o格式。
3.分享文件(*.so)
也称之为动态库文件,它涵盖了代码和数据(那一个数量是在一而再时候被连接器ld和平运动行时动态连接器使用的)。动态连接器可能称为ld.so.1,libc.so.1抑或
ld-linux.so.1。笔者的CentOS6.0系统中该文件为:/lib/ld-2.12.so

 ./configure –prefix=/usr/local/httpd24 \

图片 4

–sysconfdir=/etc/httpd24 \

四个ELF文件从连接器(Linker)的角度看,是有个别节的晤面;从程序加载器(Loader)的角度看,它是有的段(Segments)的汇集。ELF格式的顺序和分享库具备同样的协会,只是段的聚焦和节的会集上稍加不一样。
那么毕竟什么样是库呢?
库从本质上来讲是一种可实行代码的二进制格式,能够被载入内部存款和储蓄器中推行。库分静态库和动态库三种。
静态库:那类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编写翻译成的公文相当大,因为全部函数库的具有数据都会被整合进指标代码中,他的独到之处就分明了,即编写翻译后的奉行顺序无需外表的函数库援助,因为全数应用的函数都早已被编写翻译进去了。当然那也会化为她的弱项,因为若是静态函数库改造了,那么您的先后必须重新编写翻译。
动态库:那类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也能够绝不版本号,但名字务必有。相对于静态函数库,动态函数库在编写翻译的时候并从未被编写翻译进目的代码中,你的程序试行到相关函数时才调用该函数Curry的相应函数,由此动态函数库所发出的可推行文件非常的小。由于函数库未有被重组进你的顺序,而是程序运转时动态的报名并调用,所以程序的运营境况中务必提供对应的库。动态函数库的改换并不影响你的次序,所以动态函数库的升官比较便于。linux系统有多少个入眼的目录寄存相应的函数库,如/lib
/usr/lib。
当要动用静态的程序库时,连接器会寻找程序所需的函数,然后将它们拷贝到实行文书,由于这种拷贝是完好的,所以只要延续成功,静态程序库也就不再需求了。然而,对动态库来说,就不是那般。动态库会在举办顺序内留下贰个符号指明当程序推行时,首先必须载入那个库。由于动态库节省空间,linux下进展连接的缺省操作是首先连接动态库,也即是说,假设还要设有静态和动态库,不特意钦赐的话,将与动态库相连接。

–enable-so \

 

–enable-ssl \

洋洋命令都依靠libc.so.6 动态连接器

–enable-cgi \

ldd /bin/ls
linux-vdso.so.1 => (0x00007fff446d9000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fd04a836000)
librt.so.1 => /lib64/librt.so.1 (0x00007fd04a62e000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fd04a429000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fd04a221000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd049e8d000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fd049c88000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd04aa66000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd049a6b000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fd049866000)

–enable-rewrite \

ldd /bin/echo
linux-vdso.so.1 => (0x00007fffc43ff000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff982abe000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff982e63000)

–with-zlib \

ldd /bin/mv
linux-vdso.so.1 => (0x00007fffff7ff000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb609ce3000)
librt.so.1 => /lib64/librt.so.1 (0x00007fb609adb000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fb6098d2000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fb6096cd000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb609339000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb609134000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb609f13000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb608f17000)

–with-pcre \

OK,有了这几个知识,接下去我们就能够弄了解小编所做的事情是为什么了。都说例子是最棒教授,大家就从例子入手。
1、静态链接库
咱俩先营造自身的静态链接库,然后再使用它。制作静态链接库的进程中要用到gcc和ar命令。
预备多少个库的源码文件st1.c和st2.c,用它们来营造库libmytest.a,如下:

–with-apr=/usr/local/apr/ \

file /usr/bin/pkg-config
/usr/bin/pkg-config: ELF
64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.18, stripped

–with-apr-util=/usr/local/apr-util/ \

图片 5

–enable-modules=most \

静态库文件libmytest.a已经变化,用file命令查看其特性,发掘它确实是归档压缩文件。用ar
-t libmytest.a能够查阅七个静态库包涵了那多少个obj文件:

–enable-mpms-shared=all \

接下去大家就写个测量试验程序来调用库libmytest.a中所提供的三个接口print1()和print2()。

–with-mpm=event \

寻访没,静态库的编纂和调用就这么轻易,学会了吗。这里gcc的参数-L是报告编写翻译器库文件的路径是当前目录,-l是告诉编写翻译器要动用的库的名字叫mytest。

–with-ssl=/usr/local/openssl-1.0.1i

图片 6
2、动态库
静态库*.a文件的存在根本是为着帮忙较老的a.out格式的可推行文件而留存的。近些日子用的最多的要数动态库了。
动态库的后缀为*.so。在Linux发行版中多数的动态库基本都放在/usr/lib和/lib目录下。在付出和动用大家本人动态库从前,请容许作者先落里罗嗦的跟大家唠叨唠叨Linux下和动态库相关的事宜呢。
有时当大家的应用程序不能够运转时,它会提示大家说它找不到什么样的库,大概哪些库的本子又不合它食欲了之类之类的话。那么应用程序它是怎么知道须求什么库的啊?大家眼前已多少个学了个很棒的命令ldd,用就是用来查阅二个文书到底倚重了那个so库文件。
Linux系统中动态链接库的配备文件一般在/etc/ld.so.conf文本内,它其中贮存的源委是足以被Linux分享的动态联库所在的目录的名字。笔者的系统中,该文件的剧情如下:

错误音信:

图片 7

/usr/bin/ld: /usr/local/openssl-1.0.1i/lib/libcrypto.a(e_gost_err.o):
relocation R_X86_64_32 against `.data’ can not be used when making a
shared object; recompile with -fPIC

然后/etc/ld.so.conf.d/目录下寄存了累累*.conf文件,如下:

/usr/local/openssl-1.0.1i/lib/libcrypto.a: could not read symbols: Bad
value

 

collect2: ld returned 1 exit status

个中每一个conf文件表示了一种接纳的库配置内容,以mysql为例:

make[4]: *** [mod_ssl.la] Error 1

即使您是和本身同样装的CentOS6.0的种类,那么精心的读者可能会发觉,在/etc目录下还留存叁个叫作ld.so.cache的文书。从名字来看,大家了解它分明是动态链接库的如何缓存文件。
对,您说的一点没有错。为了使得动态链接库能够被系统选择,当大家修改了/etc/ld.so.conf或/etc/ld.so.conf.d/目录下的别的文件,可能往那么些目录下拷贝了新的动态链接库文件时,都要求周转八个比较重大的命令:ldconfig,该命令位于/sbin目录下,首要的用处就是承担找寻/lib和/usr/lib,以及配备文件/etc/ld.so.conf里所列的目录下搜寻可用的动态链接库文件,然后创造动态加载程序/lib/ld-linux.so.2所供给的总是和(暗中认可)缓存文件/etc/ld.so.cache(此文件里保存着曾经排好序的动态链接库名字列表)
也正是说:当用户在有个别目录上面创设或拷贝了三个动态链接库,若想使其被系统分享,能够实施一下“ldconfig  
目录名”这么些命令
。此命令的作用在于让ldconfig将钦赐目录下的动态链接库被系统分享起来,即:在缓存文件/etc/ld.so.cache中增添进钦命目录下的分享库。请留神:假设此目录不在/lib,/usr/lib及/etc/ld.so.conf文件所列的目录里面,则再一次单独运转ldconfig时,此目录下的动态链接库也许不被系统分享了。单独运营ldconfig时,它只会找寻/lib、/usr/lib以及在/etc/ld.so.conf文件里所列的目录,用它们来重新建立/etc/ld.so.cache。
故此,等会儿大家和睦开采的分享库就可以将其拷贝到/lib、/etc/lib目录里,又恐怕涂改/etc/ld.so.conf文件将我们和好的库路线增多到该文件中,再实施ldconfig命令。
非了老半天武术,终于把基础打好了,猴急的你已经按耐不住激情的想先河尝试了啊!哈哈。。。OK,说整咱就开整,接下去本人就指导我们一步一步来开采自身的动态库,然后教我们怎么去选用它。
我们有贰个头文件my_so_test.h和几个源文件test_a.c、test_b.c和test_c.c,将他们创设成贰个名叫libtest.so的动态链接库文件:

make[4]: Leaving directory `/usr/local/src/httpd-2.4.10/modules/ssl’

图片 8

make[3]: *** [shared-build-recursive] Error 1

OK,万事俱备,只欠东风。如何将那个文件编写翻译成叁个大家所急需的so文件呢?能够分两步来成功,也得以一步到位:
方法一:
1、先生成目的.o文件:

make[3]: Leaving directory `/usr/local/src/httpd-2.4.10/modules/ssl’

图片 9

make[2]: *** [shared-build-recursive] Error 1

2、再生成so文件:

make[2]: Leaving directory `/usr/local/src/httpd-2.4.10/modules’

图片 10

make[1]: *** [shared-build-recursive] Error 1

-shared该选择钦定生成动态连接库(让连接器生成T类型的导出符号表,临时候也生成弱连接W类型的导出符号),不用该标志外界程序无法连接。相当于三个可实践文件。
-fPIC:表示编写翻译为地点独立的代码,不用此选项的话编写翻译后的代码是岗位相关的所以动态载入时是通过代码拷贝的点子来知足不相同进度的急需,而无法落得确实代码段分享的目标。
办法二:一步到位。

make[1]: Leaving directory `/usr/local/src/httpd-2.4.10′

图片 11
到现在,我们制作的动态库文件libtest.so尽管马到功成了。

make: *** [all-recursive] Error 1

接下去,正是什么使用这一个动态库了。动态链接库的运用有二种办法:不仅可以够在运维时对其开始展览动态链接,又有啥不可动态加载在先后中是用它们。接下来,小编就那三种方法分别对其牵线。

让重新编写翻译OpenSSL使用-fPIC, 结果照旧同样, 最终参谋
http://www.linuxidc.com/Linux/2014-10/107919p2.htm

+++动态库的接纳+++
用法一:动态链接。

双重编译OpenSSL消除了:

图片 12

./config –prefix=/usr/local/openssl-1.0.1i -fPIC no-gost

动用“-ltest”标识来告诉GCC驱动程序在连续阶段引用分享函数库libtest.so。“-L.”标识告诉GCC函数库大概位于当前目录。不然GNU连接器会找寻规范连串函数目录。
那边我们注意,ldd的出口它说咱俩的libtest.so它没找到。还记得本人在近些日子动态链接库一节刚开始时的这堆唠叨么,以往您应当很掌握了为什么了吧。因为大家的libtest.so既不在/etc/ld.so.cache里,又不在/lib、/usr/lib或/etc/ld.so.conf所钦点的别样多个目录中。如何是好?还用小编告诉你?管你用吗办法,反正本人用的ldconfig
`pwd`搞定的:
进行结果如下:

————————————–分割线

Ubuntu 13.04 安装
LAMP\Vsftpd\Webmin\phpMyAdmin 服务及安装

http://www.linuxidc.com/Linux/2013-06/86250.htm

CentOS 5.9下编写翻译安装LAMP(Apache 2.2.44+MySQL 5.6.10+PHP 5.4.12)
http://www.linuxidc.com/Linux/2013-03/80333p3.htm

RedHat
5.4下Web服务器架设之源码构建LAMP景况及使用PHPWind
http://www.linuxidc.com/Linux/2012-10/72484p2.htm

LAMP源码景况搭建WEB服务器Linux+Apache+MySQL+PHP
http://www.linuxidc.com/Linux/2013-05/84882.htm

LAMP+Xcache 情形搭建
http://www.linuxidc.com/Linux/2014-05/101087.htm

Linux下Apache+OpenSSL配置记录
http://www.linuxidc.com/Linux/2014-09/107390.htm

图片 13

————————————–分割线

本文长久更新链接地址:http://www.linuxidc.com/Linux/2014-10/107919.htm

图片 14

图片 15

偶忍不住又要罗嗦一句了,相信侬,作者的唠叨对大家是有补益。笔者何以用这种艺术吧?因为本身是在给大家演示动态库的用法,完了之后作者就把libtest.so给删了,然后再重构ld.so.cache,对自家的系统不会其余影响。假诺笔者是支付一款软件,大概给和睦的系统DIY贰个不行实用的功用模块,那么小编更侧向于将libtest.so拷贝到/lib、/usr/lib目录下,也许本人还应该有非常的大希望在/usr/local/lib/目录下新建一文书夹xxx,将so库拷贝到那儿去,并在/etc/ld.so.conf.d/目录下新建一文本mytest.conf,内容独有一行“/usr/local/lib/xxx/libtest.so”,再奉行ldconfig。如果你在此以前还是不通晓怎么消除不行“not
found”的难点,那么今后总该明白了吗。
方法二:动态加载。
动态加载是特别灵活的,它借助于一套Linux提供的正经API来产生。在源程序里,你能够很熟识的施用API来加载、使用、释放so库财富。以下函数在代码中央银行使须求富含头文件:dlfcn.h
函数原型
说明
const char *dlerror(void)
当动态链接库操作函数推行倒闭时,dlerror能够重临出错新闻,重回值为NULL时表示操作函数试行成功。
void *dlopen(const char *filename, int flag)
用于张开内定名字(filename)的动态链接库,并赶回操作句柄。调用战败时,将回来NULL值,不然重临的是操作句柄。
void *dlsym(void *handle, char *symbol)
依据动态链接库操作句柄(handle)与符号(symbol),再次回到符号对应的函数的实行代码地址。由此地址,能够带参数实行相应的函数。
int dlclose (void *handle)
用以关闭钦点句柄的动态链接库,独有当此动态链接库的施用计数为0时,才会真的被系统卸载。2.2在先后中动用动态链接库函数。
dlsym(void *handle, char *symbol)
filename:即便名字不以“/”初始,则非相对路线名,将按下列先后顺序查找该文件。
(1)用户碰到变量中的LD_LIBRARY值;
(2)动态链接缓冲文件/etc/ld.so.cache
(3)目录/lib,/usr/lib
flag表示在如哪天候解决未定义的符号(调用)。取值有多少个:
1) RTLD_LAZY : 证明在动态链接库的函数代码实践时解决。
2) RTLD_NOW
:声明在dlopen再次来到前就一蹴即至全数未定义的标识,一旦未缓慢解决,dlopen将赶回错误。
dlsym(void *handle, char *symbol)
dlsym()的用法一般如下:
void(*add)(int x,int y); /*说美赞臣(Meadjohnson)下要调用的动态函数add */
add=dlsym(”xxx.so”,”add”); /* 打开xxx.so分享库,取add函数地址 */
add(89,369); /* 带三个参数89和369调用add函数 */
看自个儿出招:

图片 16

实践结果:

图片 17

利用动态链接库,源程序中要含有dlfcn.h头文件,写程序时留神dlopen等函数的不利调用,编写翻译时要采用-rdynamic选项与-ldl选项(不然编写翻译不恐怕通过),以发出可调用动态链接库的推行代码。
OK,通过本文的指引、演习相信各位应该对Linux的库机制有了略微打探,最关键的是会付出使用库文件了。由于自己知识所限,文中有些观念若是不到位或通晓有误的地点还请各位个人不吝赐教。

 


 

谈谈Linux下动态库查找路线的难点 ldconfig LD_LIBRARY_PATH
PKG_CONFIG_PATH

转载自:

学学到了贰个等第之后,就要求不停的总计、沉淀、清零,然后技巧一连“上路”。回看起自身当初刚接触Linux时,不管是用源码包编写翻译程序,如故程序运转时出现的和动态库的各类恩恩怨怨,心里那真叫叁个优伤。那时候脑袋里已经也犯过嘀咕,为何Linux不弄成windows那样呢,装个软件那多少个麻烦不说,连运维软件都如此恼火呢?借使这样的话就不叫Linux了。借用HTC公司首席营业官雷军一句话:三星(Samsung),为胃痛而生。笔者感觉:Linux,为真理而在。非常是为那么些喜欢折腾,热衷技能背后原理和贯彻细节的大家而生。

谈起和动态库查找路线相关的主题材料,总体上可以分成两类:
先是类:通过源代码编写翻译程序时出现的找不到有个别正视包的难点,而只要这时候你碰巧已经依照它的供给真正、铁证如山、天地良心地把注重库给装好了,它还给你耍混、犯二,有一股折腾不死人不偿命的劲儿,那让人真是气儿不打一处来,假如Linux此时有头有脸,你是否特想抽它丫两大嘴巴;
其次类:就是在运维程序的时候,明明把极度程序供给的依赖性包都已经设置的妥妥的了,可运转的时候人家就告诉你说“error
while loading shared libraries: libxxx.so.y: cannot open shared object
file: No such file or
directory”,任凭你怎么折腾都没用。此时你一旦心想“撤吧,男生,Linux太TM欺凌人了,不带这么玩儿的”,那你就大错特错了,只要您抱着“美好的政工的总会发出”和“办法永恒比难题多”的信心坚持不渝下去,你就一定会马到功成。话的野趣有一点自欺欺人,精神鸦片的意味在里头,但的确是这么个理儿。

上面两类主题素材最大的原因尽管,你没弄白它们的体制和规律。你见到的只是现象,当年学马克思主义主义经济学原理的时候,老师怎么教育大家的?要透过现象看本质。假设您把地方两中选用的原理搞清了,那难题不就大势所趋的消除了么。上边我们就相继切磋一下这些难点,以便对新进读书Linux的意中大家起叁个的参照他事他说加以考察资料的效应。

标题1:通过源代码安装程序
经过源码包安装程序时,首要使用了“三大步”战略:configure、make和make
install
。出难题最多的就是在configure阶段,比非常多初学者由于不清楚configure的那么多参数该怎么用,所以再三为了方便,一句轻巧的“./configure”下去,百分之八九十都能得逞,可难题一再就出在剩余的十分一几方面了。那让大家又三次相信了,小概率事件的发出对业务的震慑是何其的语长心重。在安装的configure阶段,为了检验安装安装意况是不是知足,平日景况下都以经过三个叫做pkg-config的工具来检验它须要依附的动态库是还是不是存在,那一个工具大家在上一篇博文已经认知过了。pkg-config日常景况都是坐落/usr/bin目录下,是个可实施程序。在configure阶段,常常都会用pkg-config来判断所依赖的动态库是或不是存在。今后难题不怕,那么些工具是怎样判别的呢?它的基于是什么样?当这五个难题弄理解了,真相也就大白了。

诚如当大家设置完有个别程序后,假设它提供了动态库的意义,在源码中都会有三个或多少个以pc结尾的文本,当施行完make
install后那些pc文件拷贝到${prefix}/lib/pkgconfig这么些目录里,这里的prefix就是大家在configure阶段时通过铺排参数–prefix钦定的,缺省事态那些值正是/usr/local,所以这个pc文件最后会被拷贝到/usr/local/lib/pkgconfig目录下。恐怕有人会问,那个pc文件有甚用吗?大家无论张开三个来瞅瞅:
[root@localhost ~]# cat /usr/local/lib/pkgconfig/librtmp.pc
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
incdir=${prefix}/include

Name: librtmp
Description: RTMP implementation
Version: v2.3
Requires: libssl,libcrypto
URL:
Libs: -L${libdir} -lrtmp -lz
Cflags: -I${incdir}
跟大家configure阶段有关的重大聚集在Libs和Cflags两项下边,要是你此时再实行下边这两条命令,就全知晓了:
[root@localhost ~]# pkg-config –cflags librtmp
-I/usr/local/include
[root@localhost ~]# pkg-config –libs librtmp
-L/usr/local/lib -lrtmp -lz -lssl -lcrypto
也等于说,pkg-config把大家之前要求在Makefile里钦点编写翻译和链接时所急需利用的参数从手工硬编码的格局改为了自动达成,节约了有一点点跨平台移植的包容性难点,大家是还是不是得谢谢人家十八辈儿祖宗。假设说,假设大家就要的编写翻译的软件包正视librtmp那一个动态库,那么此时在本身系统上这一个检查实验正是通过了。当然那只是率先步,检验过了不断定包容,这里大家只谈谈能还是不可能找到正视库的主题材料,包容性问题那都不是个事情,人家要啥版本你非凡伺候正是了,那些没得研讨,最棒也决不商量,童叟无欺,不然后果很严重。好了,若是说找不到某些库该怎么做。前提是你实在已经安装了它须要的库,不用多想,原因唯有一个,pkg-config找不到这一个与那一个库对应的pc文件。为啥会找不到啊,原因又有两点:
1、pkg-config搜索了全部它感觉适用的目录都没找着那个库对应的pc文件的骤降;
2、那么些库在布告时一向就未有提供它的pc文件。
那边,大家严重“抗议、鄙视+抵制”第两种情形的软件包,並且也尽量不要它,多少个出来混都不自报家门的东西,分明能够不到哪儿去。那么,现在难点就只剩下一个了:pkg-config的索求路线是哪儿?

pkg-config较老的本子里,缺省景观下会到/usr/lib/pkgconfig、/usr/loca/lib/pkgconfig、/usr/share/pkgconfig等目录下来搜索pc文件,据作者所知在0.23以及之后的版本里pkg-config的源码里已经未有关于缺省寻找路线的别样硬编码的成份了,至于实际从哪个版本开端自己也绝非去追究,还望有领悟的爱人共享一下。取而代之的是,当你看pkg-config的man手册时会有下边一段话:

pkg-config retrieves information about packages from special metadata
files. These files are named after the package, with the extension
.pc.
By default, pkg-config looks in the directory prefix/lib/pkgconfig for
these files; it will also look in the colon-separated (on Windows,
semicolon-separated) list of directories specified by the
PKG_CONFIG_PATH environment variable.

以及那一点补充:
PKG_CONFIG_PATH
A colon-separated (on Windows, semicolon-separated) list of directories
to search for .pc files. The default directory will always be searched
after searching the path; the default is
libdir/pkg-config:datadir/pkgconfig where libdir is the libdir where
pkg-config and datadir is the datadir where pkg-config was installed.

地点提到的prefix、libdir和datadir,正是安装pkg-config时被设定好的,具体景况是:
1、倘诺您是因而yum和rpm包安装的
prefix=/usr
libdir=${prefix}/lib=/usr/lib
datadir=${prefix}/share=/usr/share
2、若是你是透过源码包安装的,且并未有一点点名prefix的值(钦赐的景观同1)
prefix=/usr/local
libdir=${prefix}/lib=/usr/local/lib
datadir=${prefix}/share=/usr/local/share

pkg-config在查找对应软件包的信息时的缺省搜索路线已经很明亮了,有几许写错了,不是${libdir}/pkg-config,而应该是${libdir}/pkgconfig和${datadir}/pkgconfig。倘令你软件包对应的pc文件都不在那三个目录下时,pkg-config鲜明找不到。既然原因都已经找到了,这消除办法也就一应俱全了。
方案一:大家得以在安装大家十一分被注重的软件包时,在configure阶段用–prefix参数把安装目录钦定到/usr目录下;
方案二:也足以服从下边说的,通过贰个誉为PKG_CONFIG_PATH的境遇变量来向pkg-config指明我们团结的pc文件所在的路子,可是要专注的是PKG_CONFIG_PATH所钦命的门径优先级比较高,pkg-config会先举行检索,完了之后才是去寻找缺省路线。
后边七个的亮点是今后再通过源码安装软件时少了许多难为,劣势是用户本身的软件包和系统软件混到一起不方便管理,所以实际应用中,前者用的要多一些。

方案二在实操中有三种完成方式:
1、针对未有root权限的景况,大诸多处境都以实行:
export PKG_CONFIG_PATH=/your/local/path:$PKG_CONFIG_PATH

然后,在configure时就相对没难题了。
2、在用户的家目录下的.bash_profile文件里或系统文件/etc/profile的尾声增添上边一行也成,都能够。
迄今,动态库查找难点的首先种处境就彻底化解了。想询问pc文件的越多细节的,可以参谋
; 想学习pkg-config工具越来越多用法的心上人提出看man手册。

难题2:程序运维时出现libxxx.so.y => not found
这种场合,在小编原先的博文“Linux系统下动态库和静态库那点事儿”里早已提到一部分,这里就把它填补完整。在这篇博文里,我用的陈设文件大概“ldconfig
动态库所在路线”的格局消除的,也是99%的场子下的消除办法,那是对准有root权限的用户的化解办法。未有root权限运转软件时,Linux也为大家提供了一个名称叫LD_LIBRARY_PATH的遭逢变量来缓慢解决运营时动态库查找路线的消除方案。同样地,由这些情状变量所钦点的路子会棉被服装载器/lib/ld-2.12.so优先查找,然后才是动态库缓存文件/etc/ld.so.cache,风韵刹那间就被LD_LIBRARY_PATH给抢完了,/etc/ld.so.cache表示很不乐意。针对LD_LIBRARY_PATH情况变量这种状态,相对是临时不可能再一时化解方案了,假若只是测验用,用export像化解PKG_CONFIG_PATH同样的方法根本金和利息索就行了,千万不要在实质上生育上线的运营境况里把“export
LD_LIBRARY_PATH=…”
添加到.bash_profile恐怕/etc/profile里,不然到时候悔得你肠子都绿了不可。

其实PKG_CONFIG_PATH和LD_LIBRARY_PATH常常被许四人误用,极度是新手们在消除难点时,也混淆是非,逮着了正是一顿狂export,依据实际场合,运气好了只怕难题还真就一蹴而就,点儿背了折腾一天半宿也是白忙活。其实尽管留点心,依旧挺轻便驾驭的:
PKG_CONFIG_PATH从字面意思上翻译,就是“软件包的安插路线”,那不很显眼了么,编写翻译软件时一旦出现找不到所依赖的动态库时都全靠PKG_CONFIG_PATH了;
LD_LIBRARY_PATH也很直白了“装载器的库路径”,LD是Loader的简写,在博文“段错误到底是哪儿妖孽”里自个儿也曾涉及过,在Linux系统运转贰个程序的长河就叫做装载,一个顺序要施行时它或多或少的会借助一些动态库(静态编写翻译的除了)。当您用“ldd
可试行程序名”查看一个软件运行时所依靠的动态库,固然出口项有“libxxx.so.y=>
not found”一项,你那些软件百分之百运营不起来。

不信大家来做个考试:
[root@localhost ~]# echo $LD_LIBRARY_PATH //嘛也不曾

[root@localhost ~]# ldd /usr/local/bin/ffmpeg
linux-gate.so.1 => (0x00914000)
libavdevice.so.54 => /usr/local/lib/libavdevice.so.54 (0x007d0000)
libavfilter.so.3 => /usr/local/lib/libavfilter.so.3 (0x001f3000)
libavformat.so.54 => /usr/local/lib/libavformat.so.54 (0x002b5000)
libavcodec.so.54 => /usr/local/lib/libavcodec.so.54 (0xb68dd000)
libpostproc.so.52 => /usr/local/lib/libpostproc.so.52 (0x0083c000)
libswresample.so.0 => /usr/local/lib/libswresample.so.0
(0x00a91000)
libswscale.so.2 => /usr/local/lib/libswscale.so.2 (0x00d80000)
libavutil.so.52 => /usr/local/lib/libavutil.so.52 (0x001a7000)
libm.so.6 => /lib/libm.so.6 (0x0058b000)
libpthread.so.0 => /lib/libpthread.so.0 (0x001d7000)
libc.so.6 => /lib/libc.so.6 (0x005e2000)
libasound.so.2 => /lib/libasound.so.2 (0x00ec5000)
libdc1394.so.22 => /usr/local/lib/libdc1394.so.22 (0x00116000)
librt.so.1 => /lib/librt.so.1 (0x00184000)
libfreetype.so => /usr/local/lib/libfreetype.so (0x00411000)
libass.so.4 => /usr/local/lib/libass.so.4 (0x0091a000)
libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x0048c000)
libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0
(0x00aa8000)
librtmp.so.0 => /usr/local/lib/librtmp.so.0 (0x009dd000)
libz.so.1 => /lib/libz.so.1 (0x0018d000)
libx264.so.132 => /usr/local/lib/libx264.so.132 (0x00fb1000)
libvorbisenc.so.2 => /usr/local/lib/libvorbisenc.so.2 (0x0194d000)
libvorbis.so.0 => /usr/local/lib/libvorbis.so.0 (0x004e5000)
libvo-aacenc.so.0 => /usr/local/lib/libvo-aacenc.so.0 (0x00799000)
libtwolame.so.0 => /usr/local/lib/libtwolame.so.0 (0x0050d000)
libtheoraenc.so.1 => /usr/local/lib/libtheoraenc.so.1 (0x0052d000)
libtheoradec.so.1 => /usr/local/lib/libtheoradec.so.1 (0x00779000)
libspeex.so.1 => /usr/local/lib/libspeex.so.1 (0x00c94000)
libmp3lame.so.0 => /usr/local/lib/libmp3lame.so.0 (0x0088c000)
libfaac.so.0 => /usr/local/lib/libfaac.so.0 (0x00573000)
/lib/ld-linux.so.2 (0x005c2000)
libdl.so.2 => /lib/libdl.so.2 (0x001a1000)
libraw1394.so.11 => /usr/local/lib/libraw1394.so.11 (0x005b5000)
libfribidi.so.0 => /usr/local/lib/libfribidi.so.0 (0x007b5000)
libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1
(0x007ea000)
libogg.so.0 => /usr/local/lib/libogg.so.0 (0x00583000)
libexpat.so.1 => /lib/libexpat.so.1 (0x00933000)
本身的种类里未有安装LD_LIBRARY_PATH景况变量,上一篇博文里编写翻译的ffmpeg运营时重视的这么些多的动态库。未来大家把个中的一个库libVCDlame.so.0从/usr/loca/lib下活动到/opt目录里,并实践ldconfig,让libVCDlame.so.0深透从/etc/ld.so.cache里面未有。其实libVCDlame.so.0只是libVCDlame.so.0.0.0的三个符号链接,大家的确需求活动的是后人,完了之后再实行ldd
/usr/local/bin/ffmpeg时结果如下:

[root@localhost ~]# ldd /usr/local/bin/ffmpeg
linux-gate.so.1 => (0x00249000)
libavdevice.so.54 => /usr/local/lib/libavdevice.so.54 (0x00e12000)
libavfilter.so.3 => /usr/local/lib/libavfilter.so.3 (0x00ccd000)
libavformat.so.54 => /usr/local/lib/libavformat.so.54 (0x00891000)
libavcodec.so.54 => /usr/local/lib/libavcodec.so.54 (0xb6877000)
libpostproc.so.52 => /usr/local/lib/libpostproc.so.52 (0x001a6000)
libswresample.so.0 => /usr/local/lib/libswresample.so.0
(0x00b8f000)
libswscale.so.2 => /usr/local/lib/libswscale.so.2 (0x0024a000)
libavutil.so.52 => /usr/local/lib/libavutil.so.52 (0x005d7000)
libm.so.6 => /lib/libm.so.6 (0x007ad000)
libpthread.so.0 => /lib/libpthread.so.0 (0x001f6000)
libc.so.6 => /lib/libc.so.6 (0x0029f000)
libasound.so.2 => /lib/libasound.so.2 (0x00604000)
libdc1394.so.22 => /usr/local/lib/libdc1394.so.22 (0x00436000)
librt.so.1 => /lib/librt.so.1 (0x00a06000)
libfreetype.so => /usr/local/lib/libfreetype.so (0x0052d000)
libass.so.4 => /usr/local/lib/libass.so.4 (0x00211000)
libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x00eed000)
libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0
(0x00f46000)
librtmp.so.0 => /usr/local/lib/librtmp.so.0 (0x004b9000)
libz.so.1 => /lib/libz.so.1 (0x0022a000)
libx264.so.132 => /usr/local/lib/libx264.so.132 (0x0765d000)
libvorbisenc.so.2 => /usr/local/lib/libvorbisenc.so.2 (0x00a0f000)
libvorbis.so.0 => /usr/local/lib/libvorbis.so.0 (0x004ce000)
libvo-aacenc.so.0 => /usr/local/lib/libvo-aacenc.so.0 (0x005a8000)
libtwolame.so.0 => /usr/local/lib/libtwolame.so.0 (0x006f0000)
libtheoraenc.so.1 => /usr/local/lib/libtheoraenc.so.1 (0x00710000)
libtheoradec.so.1 => /usr/local/lib/libtheoradec.so.1 (0x00756000)
libspeex.so.1 => /usr/local/lib/libspeex.so.1 (0x00770000)
libVCDlame.so.0 => not found //果然飘红了 🙂
libfaac.so.0 => /usr/local/lib/libfaac.so.0 (0x004a4000)
/lib/ld-linux.so.2 (0x0050d000)
libdl.so.2 => /lib/libdl.so.2 (0x0023e000)
libraw1394.so.11 => /usr/local/lib/libraw1394.so.11 (0x004f6000)
libfribidi.so.0 => /usr/local/lib/libfribidi.so.0 (0x0078a000)
libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1
(0x007d7000)
libogg.so.0 => /usr/local/lib/libogg.so.0 (0x00243000)
libexpat.so.1 => /lib/libexpat.so.1 (0x00806000)

[root@localhost ~]# ffmpeg –help
ffmpeg: error while loading shared libraries: libmp4lame.so.0: cannot
open shared object file: No such file or directory
//此时ffmpeg当然运营不起来
小编们来试试看LD_LIBRARY_PATH,看看好使不:
[root@localhost opt]# export
LD_LIBRARY_PATH=/opt:$LD_LIBRARY_PATH
[root@localhost opt]#
[root@localhost opt]# ldd /usr/local/bin/ffmpeg
linux-gate.so.1 => (0x00136000)
libavdevice.so.54 => /usr/local/lib/libavdevice.so.54 (0x00552000)
libavfilter.so.3 => /usr/local/lib/libavfilter.so.3 (0x00655000)
libavformat.so.54 => /usr/local/lib/libavformat.so.54 (0x00243000)
libavcodec.so.54 => /usr/local/lib/libavcodec.so.54 (0xb68a7000)
libpostproc.so.52 => /usr/local/lib/libpostproc.so.52 (0x00137000)
libswresample.so.0 => /usr/local/lib/libswresample.so.0
(0x00187000)
libswscale.so.2 => /usr/local/lib/libswscale.so.2 (0x0047e000)
libavutil.so.52 => /usr/local/lib/libavutil.so.52 (0x00a9d000)
libm.so.6 => /lib/libm.so.6 (0x00af9000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00823000)
libc.so.6 => /lib/libc.so.6 (0x0083e000)
libasound.so.2 => /lib/libasound.so.2 (0x0055f000)
libdc1394.so.22 => /usr/local/lib/libdc1394.so.22 (0x0019e000)
librt.so.1 => /lib/librt.so.1 (0x00b3c000)
libfreetype.so => /usr/local/lib/libfreetype.so (0x0039f000)
libass.so.4 => /usr/local/lib/libass.so.4 (0x00f67000)
libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x00cb3000)
libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0
(0x00d0c000)
librtmp.so.0 => /usr/local/lib/librtmp.so.0 (0x0020c000)
libz.so.1 => /lib/libz.so.1 (0x00c77000)
libx264.so.132 => /usr/local/lib/libx264.so.132 (0x00f80000)
libvorbisenc.so.2 => /usr/local/lib/libvorbisenc.so.2 (0x07c66000)
libvorbis.so.0 => /usr/local/lib/libvorbis.so.0 (0x0041a000)
libvo-aacenc.so.0 => /usr/local/lib/libvo-aacenc.so.0 (0x0076c000)
libtwolame.so.0 => /usr/local/lib/libtwolame.so.0 (0x004fe000)
libtheoraenc.so.1 => /usr/local/lib/libtheoraenc.so.1 (0x00717000)
libtheoradec.so.1 => /usr/local/lib/libtheoradec.so.1 (0x00f0c000)
libspeex.so.1 => /usr/local/lib/libspeex.so.1 (0x00221000)
libmp3lame.so.0 => not found //纳尼??!!!
libfaac.so.0 => /usr/local/lib/libfaac.so.0 (0x00124000)
/lib/ld-linux.so.2 (0x00bad000)
libdl.so.2 => /lib/libdl.so.2 (0x0023b000)
libraw1394.so.11 => /usr/local/lib/libraw1394.so.11 (0x007b6000)
libfribidi.so.0 => /usr/local/lib/libfribidi.so.0 (0x00442000)
libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1
(0x0051e000)
libogg.so.0 => /usr/local/lib/libogg.so.0 (0x009f7000)
libexpat.so.1 => /lib/libexpat.so.1 (0x00b60000)
还记得下边提到了软链接么,libmp4lame.so.0就是libmp4lame.so.0.0.0的软链接,这是动态库的命名规范的一种公约,大家假若在/opt/目录下创造一个名字为libDVDlame.so.0的到/opt/libVCDlame.so.0.0.0的软链接就OK了:

[root@localhost opt]# ls
libmp3lame.so.0.0.0
[root@localhost opt]# ln -s libmp3lame.so.0.0.0 libmp3lame.so.0
[root@localhost opt]# ll
total 316
lrwxrwxrwx. 1 root root 19 Dec 7 23:27 libmp3lame.so.0 ->
libmp3lame.so.0.0.0
-rwxr-xr-x. 1 root root 321228 Dec 7 23:25 libmp3lame.so.0.0.0
[root@localhost opt]# ldd /usr/local/bin/ffmpeg
linux-gate.so.1 => (0x00cc4000)
libavdevice.so.54 => /usr/local/lib/libavdevice.so.54 (0x00577000)
libavfilter.so.3 => /usr/local/lib/libavfilter.so.3 (0x00e3f000)
libavformat.so.54 => /usr/local/lib/libavformat.so.54 (0x00202000)
libavcodec.so.54 => /usr/local/lib/libavcodec.so.54 (0x00f01000)
libpostproc.so.52 => /usr/local/lib/libpostproc.so.52 (0x00170000)
libswresample.so.0 => /usr/local/lib/libswresample.so.0
(0x00750000)
libswscale.so.2 => /usr/local/lib/libswscale.so.2 (0x0035e000)
libavutil.so.52 => /usr/local/lib/libavutil.so.52 (0x005ba000)
libm.so.6 => /lib/libm.so.6 (0x00452000)
libpthread.so.0 => /lib/libpthread.so.0 (0x001c0000)
libc.so.6 => /lib/libc.so.6 (0x008c2000)
libasound.so.2 => /lib/libasound.so.2 (0x0047c000)
libdc1394.so.22 => /usr/local/lib/libdc1394.so.22 (0x003d6000)
librt.so.1 => /lib/librt.so.1 (0x00db3000)
libfreetype.so => /usr/local/lib/libfreetype.so (0x00a80000)
libass.so.4 => /usr/local/lib/libass.so.4 (0x001db000)
libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x005e7000)
libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0
(0x00afb000)
librtmp.so.0 => /usr/local/lib/librtmp.so.0 (0x00584000)
libz.so.1 => /lib/libz.so.1 (0x00599000)
libx264.so.132 => /usr/local/lib/libx264.so.132 (0x02bc9000)
libvorbisenc.so.2 => /usr/local/lib/libvorbisenc.so.2 (0x05ccd000)
libvorbis.so.0 => /usr/local/lib/libvorbis.so.0 (0x00640000)
libvo-aacenc.so.0 => /usr/local/lib/libvo-aacenc.so.0 (0x00834000)
libtwolame.so.0 => /usr/local/lib/libtwolame.so.0 (0x00668000)
libtheoraenc.so.1 => /usr/local/lib/libtheoraenc.so.1 (0x00688000)
libtheoradec.so.1 => /usr/local/lib/libtheoradec.so.1 (0x006ce000)
libspeex.so.1 => /usr/local/lib/libspeex.so.1 (0x00815000)
libmp4lame.so.0 => /opt/libmp5lame.so.0 (0x00767000) //终于圆满了:)
libfaac.so.0 => /usr/local/lib/libfaac.so.0 (0x006e8000)
/lib/ld-linux.so.2 (0x003b6000)
libdl.so.2 => /lib/libdl.so.2 (0x001f4000)
libraw1394.so.11 => /usr/local/lib/libraw1394.so.11 (0x00444000)
libfribidi.so.0 => /usr/local/lib/libfribidi.so.0 (0x006f8000)
libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1
(0x00710000)
libogg.so.0 => /usr/local/lib/libogg.so.0 (0x001f9000)
libexpat.so.1 => /lib/libexpat.so.1 (0x007e3000)

进而说,针对动态库路线查找的各类难题,无非就像此两大类,关键是找对原因,根据各州的具体情状制定方案,方能药到病除。

 

 

从没root权限消除分享库查找并使用的主题素材

ll /etc/ld.so.conf
-rw-r–r– 1 root root 64 May 7 13:28 /etc/ld.so.conf

 

不曾root权限运维软件时,Linux也为我们提供了贰个名叫LD_LIBRARY_PATH的意况变量来消除运营时动态库查找路线的缓慢解决方案。一样地,由那个遭遇变量所钦定的路线会棉被服装载器/lib/ld-2.12.so优先查找,然后才是动态库缓存文件/etc/ld.so.cache,风范刹那间就被LD_LIBRARY_PATH给抢完了,/etc/ld.so.cache表示很不喜悦。针对LD_LIBRARY_PATH境况变量这种境况,相对是不经常不可能再有的时候消除方案了,如果只是测试用,用export像消除PKG_CONFIG_PATH同样的方法根本金和利息索就行了,千万不要在事实上生产上线的运行情况里把export
LD_LIBRARY_PATH=

 

export LD_LIBRARY_PATH=共享库地址 (/lib64/libc.so.6 )

unset LD_LIBRARY_PATH

洋洋发令都依赖libc.so.6 动态连接器

ldd /bin/ls
linux-vdso.so.1 => (0x00007fff446d9000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fd04a836000)
librt.so.1 => /lib64/librt.so.1 (0x00007fd04a62e000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fd04a429000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fd04a221000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd049e8d000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fd049c88000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd04aa66000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd049a6b000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fd049866000)

ldd /bin/echo
linux-vdso.so.1 => (0x00007fffc43ff000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff982abe000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff982e63000)

ldd /bin/mv
linux-vdso.so.1 => (0x00007fffff7ff000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb609ce3000)
librt.so.1 => /lib64/librt.so.1 (0x00007fb609adb000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fb6098d2000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fb6096cd000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb609339000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb609134000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb609f13000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb608f17000)

f


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图