Ⅰ 求助linux大神!非root用户安装软件时如何调用系统的库文件
一般你增加库文件目录后,需要用ldconfig 更新库文件路径的。
首先你要修改 /etc/ld.so.conf(不同发行版本不一样,你需要自己修改对应发行版本下的文件),增加你的库文件所在的目录,然后运行sudo ldconfig更新一下库缓存即可。
基于安全因素,你必须要有root权限运行这一次即可,以后不在需要了。
理论上,zlib这些库应该已经安装了的,请检查你的php是否安装正确?
Ⅱ linux 中 库文件/lib /usr/lib属不属于内核的一部分,如果不属于是不是各个发行商开发的
库文件分成内核函数库,c库,应用程序库
内核库你是看不见的,因为内核编译好后就是一个文件vmlinux。
c库是独立于linux的,甚至是高于linux,因为linux的api开发是符合posix c标准的。c库独立于linux安装,你可以重新安装你的linux电脑上的glibc库,怎么安装就要深入学习了。
应用程序库包括你的计算机上安装的软件提供的库甚至是你自己编写的库。
因此,/lib /usr/lib当然不是内核的一部分,里面可以是c库,或者应用程序库。你所谓的不同版本的linux的表述也是不清晰的,分清楚两个概念,linux内核和linux发行版。linux内核在你的电脑上只是一个文件vmlinux,其他的全是应用软件。
至于库函数如何与内核互通,我可以告诉你是通过系统调用,但你暂时肯定是理解不了的,慢慢学吧。加油!
Ⅲ 请问linux里头文件与库文件有什么区别
头文件中有函数的申明,库文件实现函数的定义。
比如,printf函数。使用时应包括stdio.h,专打开stdio.h你只属能看到,printf这
个函数的申明,却看不到printf具体是怎么实现的,而函数的实现在相应的C库
中。而库文件一般是以二进制形式而不是C源文件形式提供给用户使用的。程序
中包括了stdio.h这个头文件。链接器就能根据头件中的信息找到printf这个函
数的实现并链接进这个程序代码段里。
总结起来就是,库文件通过头文件向外导出接口。用户通过头文件找到库文件中
函数实现的代码从而把这段代码链接到用户程序中去。
Ⅳ Linux如何解决动态库的版本控制
3.共享库,小版本升级,即接口不变.
当升级小版本时,共享库的soname 是不变的,所以需要重新把soname 的那个连接文件指定新版本就可以。 调用ldconfig命令,系统会帮你做修改那个soname link文件,并把它指向新的版本呢。这时候你的应用程序就自动升级了。
4.共享库,主版本升级,即接口发生变化。
当升级主版本时,共享库的soname 就会加1.比如libhello.so.0.0.0 变为 libhello.so.1.0.0. 这时候再运行ldconfig 文件,就会发现生成两个连接 文件。
ln -s libhello.so.0----libhello.so.0.0.0
ln -s libhello.so.1-----libhello.so.1.0.0
尽管共享库升级,但是你的程序依旧用的是旧的共享库,并且两个之间不会相互影响。
问题是如果更新的共享库只是增加一些接口,并没有修改已有的接口,也就是向前兼容。但是这时候它的主版本号却增加1. 如果你的应用程序想调用新的共享库,该怎么办? 简单,只要手工把soname 文件修改,使其指向新的版本就可以。(这时候ldconfig 文件不会帮你做这样的事,因为这时候soname 和real name 的版本号主板本号不一致,只能手动修改)。
比如: ln -s libhello.so.0 --- libhello.so.1.0.0
但是有时候,主版本号增加,接口发生变化,可能向前不兼容。这时候再这样子修改,就会报错,“xx”方法找不到之类的错误。
总结一下,Linux 系统是通过共享库的三个不同名字,来管理共享库的多个版本。 real name 就是共享库的实际文件名字,soname 就是共享库加载时的用的文件名。在生成共享库的时候,编译器将soname 绑定到共享库的文件头里,二者关联起来。 在应用程序引用共享库时,其通过link name 来完成,link时将按照系统指定的目录去搜索link名字找到共享库,并将共享库的soname写在应用程序的头文件里。当应用程序加载共享库时,就会通过soname在系统指定的目录(path or LD_LIBRARY)去寻找共享库。
当共享库升级时,分为两种。一种是主板本不变,升级小版本和build 号。在这种情况下,系统会通过更新soname( ldconfig 来维护),来使用新的版本号。这中情况下,旧版本就没有用,可以删掉。
另外一种是主版本升级,其意味着库的接口发生变化,当然,这时候不能覆盖已有的soname。系统通过增加一个soname(ldconfig -p 里面增加一项),使得新旧版本同时存在。原有的应用程序在加载时,还是根据自己头文件的旧soname 去寻找老的库文件。
这是一个trick 的地方。第一系统将会在生成库的时候,就没有soname放到库的头里面。从而应用程序连接时候,就把linkname 放到应用程序依赖库里面。或者换句话说就是,soname这时候不带版本号。 有时候有人直接利用这点来升级应用程序,比如,新版本的库,直接拷贝到系统目录下,就会覆盖掉已经存在的旧的库文件,直接升级。 这个给程序员很大程度的便利性,如果一步小心,就会调到类似windows的Dll hell 陷阱里面。建议不要这样做。
【Note】
1. 指定共享库加载的路径。LD_LIBRARY_PATH 优先于 path 环境变量。
2. ldd 可以查看程序,或者共享库依赖的库的路径
3. nm 查看共享库暴露的接口
4. ldconfig 可以自动生成soname 的连接文件。并提供catch 加速查找。
5.readelf 可以查看动态库的信息,比如依赖的库,本身的soname。
6. objmp 与readelf 类似。
7 ld The GUN linker
8. ld.so dynamic linker or loader
9. as the portable GNU assembley
Ⅳ linux中jpeglib库文件我安装了,但是我运行自己写的代码老是找不到这个库
export LD_LIBRARY_PATH=/usr/local/lib
就可以了。但这个方法是一次性的,这个设置只保存在内存专,关闭终端再开启就没了。
网上搜索后属发现~/.bashrc文件在每次登陆和每次打开
shell 都读取一次,~/.bash_profile在登陆时读取一次,所以可以把配置语句写进其中一个:
[plain] view plain
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
可以直接命令行输入:
[plain] view plain
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib' >> ~/.bashrc
也可以用vim编辑器打开编辑。
这样每次打开终端,系统就实现自动配置了。