先来看一段网上的资料 预热
Linux常见的安装为tar,zip,gz,rpm,deb,bin等。我们可以简单的分为三类.
第一:打包或压缩文件tar,zip,gz等,一般解压后即可,或者解压后运行sh文件;
安装过程
tar –xvzf 软件包名”,就可以一步完成解压与解包工作
执行“./configure -prefix=/opt/fcitx “命令为编译做好准备;
执行“make”命令进行软件编译;
执行“make install”完成安装
执行“make clean”删除安装时产生的临时文件
Kinstall和Kife,2个软件可以解决tar安装卸载的问题
第二:对应的有管理工具的deb,rpm等,通常的这类安装文件可以通过第三方的命令行或UI来简单的安装,例如Ubuntu中的apt来安装deb,Redhat中的yum来安装rpm;
第三:像.bin类,其实就是把sh和zip打包为bin,或把sh和rpm打包为bin等,当在命令行运行bin安装文件时,其实就是bin里面的sh来解压bin中的zip或安装rpm的过程。
安装过程
chmod +x soft.bin
./soft.bin //运行这个命令就可以安装软件了
卸载的话进入安装目录删除即可。
上面这些资料在网上一搜一大箩筐,因为很常见所以资料很多,不过今天我想唠叨的是使用上述那些命令背后的事情,虽然linux上安装格式很多,以至于软件安装过程中遇到很多错误的地方,但他们之前所做的一些操作都是相同的,因为他们都需要经过编译,当我们了解了linux下面的编译流程,安装软件中在遇见一些问题,那就不是小case了吗!!嘿嘿……,先补充一下关于linux下关于
编译的那些事
Linux 系统上真正认识的可执行文件其实是二进制文件 ( binary program),例如 /usr/bin/passwd, /bin/touch 这些个档案为二进制程序代码。那么怎么样查看一个文件是否是二进制文件还是shell script,? [root@localhost soft]##file filename , 如果出现类似的“/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped ,说明filename是一个二进制并且是可以执行的,执行文件类别是ELF 64-bit LSB executable,使用了动态链接库(uses shared libs)。如果是shell scrript的话,那他就会显示出 text executables 之类的字样!,
Hello编译
在 Linux 上面最标准的程序语言为 C ,所以我使用 C 的语法进行源代码的书写,写完后,以 Linux 上标准的 C 语言编译程序 gcc 这支程序来编译,就可以制作一支可以执行的 binary program 啰。
由于不同版本的核心所使用的系统名称可能不相同,而且每个软件所需要的相依的函式库也不相同, 同时,软件开发商不会仅针对 Linux 开发,而是会针对整个 Unix-Like 做开发啊!所以在编译之前有必须先做一下该操作系统平台有没有提供适合的编译程序,通常这支侦测程序的文件名为 configure 戒者是 config。(解压安装目录后里面有一个configure的文件),该检测程序完成后就会生成一个Makefile的规划档案,然后当系统执行make命令的时候会去找Makefile。所以编译的时候你要做的有2个步骤,1,执行configure来建立Makefile。2,用make命令编译Makefile即可。下面以helloword来举例,编译一个自己写的程序
[root@localhost soft]# vim hello.c
#include <stdio.h>
int main(void){
printf("Hello World\n");
}
开始编译与测试执行
[root@localhost soft]# gcc hello.c
你会看到下面生成一个中间产物a.out
[root@localhost soft]# ./a.out
输出成功 Hello World
在上面的例子中hello.c 就是原始码,而 gcc 就是编译程序,至亍 a.out 就是编译成功的可执行 binary program 啰!这个例子只是在屏幕上面输出一些字符而已,不牵涉到系统库,更不牵涉到其他子程序,如果一个程序牵涉到了4,5个子程序,那么我们编译的时候应该一个一个的写命令,而且必要时还要加上编译路径,比如:#gcc -c main.c #gcc-c haha.c 等等.编译的过程需要迚行好多动作啊!而且如果要重新编译,则上述的流程得要重新来一遍,光是找出这些指令就够烦人的了! 如果可以的话,能不能一个步骤就给他完成上面所有的动作呢?那就利用 make 这个工具吧!先试看看在这个目录下建立一个名为 makefile 的档案。
[root@localhost soft]# vim makefile
main:hello.c
gcc -c hello.c
上面有个固定语法就是gcc前面有个tab键
[root@localhost soft]# make
执行make输出makefile的内容,查看
当前目录下多了1个文件hello.O,下面对一些库文件做些解析
1,.o、.a、.so文件都是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据。
优点:程序模块化,容易重新编译,方便升级。
分类:静态函数库(对应.a文件)、共享函数库(对应.so文件,类似于Windows的dll文件)、动态加载函数库(对应.o文件,相当于Windows里的.obj文件),下面总结make下面安装软件的步骤:1. ./configure 这个步骤就是在建立 Makefile 这个档案啰!通常程序开发者会写一支 scripts 来检查你的 Linux 系统、相关的软件属性等等,这个步骤相当的重要, 因为未来你的安装信息都是这一步骤内完成的!另外,这个步骤的相关信息应该要参考一下该目录下的 README 戒 INSTALL 相关的档案!
2. make clean make 会读取 Makefile 中关亍 clean 的工作。这个步骤丌一定会有,但是希望执行一下,因为他可以去除目标档案!因为谁也丌确定原始码里面到底有没有包吨上次编译过的目标档案 (*.o) 存在,所以当然还是清除一下比较妥当的。 至少等一下新编译出来的执行档我们可以确定是使用自己的机器所编译完成的嘛!
3. make make 会依据 Makefile 当中的预讴工作迚行编译的行为!编译的工作主要是迚行 gcc 来将原始码编译成为可以被执行的 object files ,但是这些 object files 通常还需要一些凼式库乊类的 link 后,才能产生一个完整的执行档!使用 make 就是要将原始码编译成为可以被执行的可执行文件,而这个可执行文件会放置在目前所在的目录乊下, 尚未被安装到预定安装的目录中;
4. make install 通常这就是最后的安装步骤了,make 会依据 Makefile 这个档案里面关亍 install 的项目,将上一个步骤所编译完成的数据给他安装到预定的目录中,就完成安装啦!请注意,上面的步骤是一步一步来迚行的,而其中只要一个步骤无法成功,那么后续的步骤就完全没有办法进行的!
关于函数库
简单的说就是在自己的程序里面引用的一段功能函数,Linux 的核心提供很多的核心相关函式库不外部参数, 这些核心功能在于硬件的驱劢程序的时候是相当有用的信息,这些核心相关信息大多放置在 /usr/include, /lib, /usr/lib 里面哩,
静态函数库 扩展名 为.a
动态函数库 扩展名 为.so
目前大多数函式库都做成动态的,再来要知道的就是,那有没有办法增加函式库的读取效能? 我们知道内存的访问速度是硬盘的好几倍,所以,如果我们将常用到的函式库先加载内存当中 (快取, cache),如此一来,当软件要取用函式库时,就需要仍头由硬盘里面读出啰! 这样不就可以增加函数式库的读取速度?没错,是这样的!这个时候就需要 ldconfig 与 /etc/ld.so.conf 的协助了。如何将 动态函式库加载高速缓存当中呢?
1. 首先,我们必须要在 /etc/ld.so.conf 里面写下 想要读入高速缓存当中的 动态函式库所在的目录』,注意喔, 是目录而不是档案;
2. 接下来则是利用 ldconfig 这个执行档将 /etc/ld.so.conf 的资料读入快取当中;
3. 同时也将数据记录一份在 /etc/ld.so.cache 这个档案当中吶!
安装指定路径:
1,Make方式安装:执行安装路径 一般来说 configure 预定参数较重要的就是那个 --prefix=/path 了,--prefix 后面接的路径就是『这个软件未来要安装到那个目录去?』如果你没有指定 --prefix=/path 这个参数,通常预定参数就是 /usr/local
2,RPM方式安装: 后接参数 --prefix 新路径 要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录, 就可以使用--prefix /usr/local来处理了
安装成功后生成默认文件分散地方:
我们晓得几乎每个软件都会提供联机帮助的服务,那就是 info 不 man 的功能。在预期的情况下, man 会去搜寻 /usr/local/man 里面的说明文件, 因此,如果我们将软件安装在 /usr/local 底下的话,那么自然安装完成之后, 该软件的说明文件就可以被找到了。此外,如果你所管理的主机其实是由多人共同管理的, 戒者是如同学校里面,一部主机是由学生管理的,但是学生总会毕业吧? 所以需要迚行交接,如果大家都将软件安装在 /usr/local 底下,那么管理上不就显的特别的容易吗!
其实软件大都是摆在 etc, lib, bin, man 等目录当中,分别代表『配置文件、函式库、执行档、联机帮文档。 好了,那么你是以 make 来安装时呢?如果是放在预定义的 /usr/local 里面,由亍 /usr/local 原本就默认这几个目录了,所以你的数据就会被放在,/usr/local/etc /usr/local/bin /usr/local/lib /usr/local/man
关于RPM
大家知道,用RPM可以查询,验证,更新已经安装的软件,甚至还可以查询软件安装后的产物放到了哪个地方,那么他是怎么做到的呢?! 一般来说,RPM 类型的档案在安装的时候,会先去读取档案内记载的设定参数内容,然后将该数据用来比对 Linux 系统的环境,以找出是否有属性相依的软件尚未安装的问题。例如 Openssh 这个联机软件需要透过 Openssl 这个加密软件的帮忙,所以得先安装 openssl 才能装 openssh 的意思。那你的环境如果没有 openssl , 妳就无法安装 openssh 的意思啦。 若环境检查合格了,那举 RPM 档案就开始被安装到你的 Linux 系统上。安装完毕后,该软件相关的信息就会被写入 /var/lib/rpm/ 目录下的数据库档案中了。 上面这个目录内的数据很重要喔!因为未来如果我们有任何软件升级的需求,版本之间的比较就是来自亍这个数据库, 而如果妳想要查询系统已经安装的软件,也是仍这里查询的!同时,目前的 RPM 也提供数字签名信息, 这些数字签名也是在这个目录内记录的呢!所以说,这个目录得要注意不要被删除了啊!
Rpm 格式 rp-pppoe-3.1-5.i386.rpm
软件名称 软件的版本信息 释出的次数 适合的硬件平台 扩展名
i386, i586, i686, x86_64 与 noarch 我应该选择哪个?
i386几乎适用于所有的x86平台
i586针对586等级的计算机进行优化编译
i686在K7以后等级的cpu都属于这个686等级
x86_64针对64位的cpu进行优化编译设定 (64bit的系统优先使用)
noarch 没有任何硬件等级上的限制
受惠于目前 x86 系统的支持方面,新的 CPU 都能够执行旧型 CPU 所支持的软件,也就是说硬件方面都可以向下兼容的, 因此最低等级的 i386 软件可以安装在所有的 x86 硬件平台上面,如果你的系统是64bit的,应该选i386,x86_64类型的安装包
RPM优点
l RPM 内含已经编译过的程序不配置文件等数据,可以让用户克除重新编译的扰;
l RPM 在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免档案被错误安装;
l RPM 档案本身提供软件版本信息、相依属性软件名称、软件用途说明、软件所在档案等信息,便亍了解软件;
l RPM 管理的方式使用数据库记录 RPM 档案的相关参数,便于升级、移除、查询不验证。
RPM安装时常用参数的选项
--replacepkgs 重新安装某个已经安装过的软件!如果妳要安装一堆 RPM 软件档案时,可以使用 rpm -ivh *.rpm ,但若某些软件已经安装过了, 此时系统会出现『某软件已安装』的信息,导致无法继续安装。此时可使用这个选项来重复安装喔!
--test 想要测试一下该软件是否可以被安装到使用者的 Linux 环境当中,可找出是否有属性相依的问题。范例为: rpm -ivh pkgname.i386.rpm --test
--prefix新路径 要将软件安装到其他非正规目录时。丼例来说,妳想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录, 就可以使用『 --prefix /usr/local 』来处理了。
RPM强大的查询
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库档案啦!另外, RPM 也可以查询未安装的 RPM 档案内的信息喔!那如何去查询呢? 我们先来谈谈可用的选项有哪些?
-qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
-q :仅查询,后面接的软件名称是否有安装;
-qi :列出该软件的详绅信息 (information),包吨开发商、版本不说明等;
-ql :列出该软件所有的档案不目录所在完整文件名 (list);
-qc :列出该软件的所有配置文件 (找出在 /etc/ 底下的檔名而已)
-qR :列出与该软件有关的相依软件所依的档案 (Required 的意思)
YUM 配置
由前面我们自己尝试编译的helloworld可知道,如果main方法里面有对其他子程序的依赖,那安装软件的时候就必须先解决到依赖问题,如何解决软件依赖问题,那就赶快来体验体验yum这个强大的工具吧,yum 是透过分析 RPM 的标头资料后, 根据各软件的相关性制作出属性相依时的解决方案,然后可以自劢处理软件的相依属性问题,以解决软件安装与移除不升级的问题,配置文件很简单,进入/etc/yum.repos.d,目录下面 ,以我的为例,有2个仓库 一个是iso.repo,另一个是yum1.repo在这个目录下面的所有以.repo结尾的文件都是仓库,通过配置仓库信息,可以从远程 ,或者从本地自动下载和安装需要依赖rpm包。先看看iso.repo的配置,
[iso]
name=iso
baseurl=file:///home/yum_source
enabled=1
哈哈,惊呆了吧小伙伴们,是的就这样简单,当然我这是最简化了其实还有很多参数可以配置的,这里的源名字叫iso,(可以自定义),baseurl为yum源的地址,这里可知道,这是一个本地源,因为协议时file!切换到yum_source可以发现这个文件夹里面有个repodata的文件夹,注意,url地址里面一定要有这个文件夹,否则yum源不生效。
好吧,我们再看看yum1..repo里面有什么东东。
[yum1]
name=yum1
baseurl=http://ftp.twaren.net/Linux/CentOS/5/os/x86_64/
nabled=1
是的,就这么简单,只是简单的替换了一下Url连接而已,可知,这个不是本地源,需要练外网的
设置yum源之后怎么查看yum是否可用呢,输入下面命令
[root@localhost yum.repos.d]# yum repolist all
Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
Updating certificate-based repositories.
Unable to read consumer identity
repo id repo name status
iso iso enabled: 2161
yum1 yum1 enabled: 3641
repolist: 5802
由上面输出,status那一列,enabled了,就表明配置基本可以了!
Yum使用
查询功能:yum [list|info|search|provides|whatprovides] 参数
安装/升级功能:yum [install|update] 软件
移除功能:yum [remove] 软件
推荐的Yum源
高速源 http://ftp.twaren.net/Linux/CentOS/5/ 里面有针对64bit系统的组件和针对i386平台的组件。
总结 :linux下安装软件学问很多,本文只起到一个引领的的作用,理解了Linux下编译原理和过程,即使安装过程中碰到了错误,也很好解决了。这就是我写这篇文档的目的。经验是无价的,随后会奉上linux下面安装经常遇到的问题!由于系统参数配置不相同,仅供参考!
经常遇见的问题
1,/usr/local/bin/scli: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
解决方案:
需要安装glibc*i686.prm(32bit类库)一般在安装包里面可以找到 或通过yum解决
2, 共享库的问题
如果未安装必需的 32 位软件包,那么在运行 32 位和 64 位 Red Hat Enterprise Linux® Advanced Server 4 和 Red Hat Enterprise Linux 5 Advanced Platform 的计算机上进行安装时会失败。
解决方案:
32 位软件包名称 | 安装期间找不软件包时显示的错误消息 |
glibc-2.3.4-2.9 | 警告:已将 /etc/localtime 保存为 /etc/localtime.rpmsave 警告:已将 /etc/ld.so.conf 保存为 /etc/ld.so.conf.rpmsave 错误:%postun(glibc-2.3.4-2.25.i686) scriptlet 失败,退出状态 255 *** 检测到 glibc *** double free 或 损坏(fasttop):0x09796e40 *** 错误:%trigger(redhat-lsb-3.0-8.EL.i386) scriptlet 失败,退出状态 0 |
xorg-x11-libs-6.8.2-1.EL.13.6 | 安装程序无法以图形方式运行。 请尝试在运行安装程序时带上 -console 或 –silent 标志。 |
libstdc++-3.4.3-22.1 | ./bin/uvsh:装入时出错 共享库:libstdc++.so.6:无法打开共享对象文件: 无此文件或目录 |
compat-libstdc++-33-3.2.3-47.3 | ESuite10092:一个或多个组合件未正确安装 |
libdl.so.2 | 装入共享库时出错:libdl.so.2: 无法打开共享对象文件:无此文件或目录 |
libpthread.so.0libc.so.6 | 此系统中找不到 Java 运行时环境(JRE)。 |
3,共享库问题 (联想上面编译程序的时候用到的动态链接库)
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:
tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
原因一般有两个: 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可.
另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.
所以安装共享库后要注意共享库路径设置问题, 如下:
1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令
ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.
2) 如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
一般来讲这只是一种临时的解决方案, 在没有权限或临时需要的时候使用.
error while loading shared libraries 的解决方法
编译安装openmoko的gsmd
#./configure
#make
#make install
然后运行:
#gsmd -s 115200 -p /dev/ttyS0
#libgsmd-tool
报错:error while loading shared libraries: libgsmd.so.0: cannot open shared object file: No such file or directory
tank@debian:/usr/local/lib$ which libgsmd-tool
/usr/local/bin/libgsmd-tool
tank@debian:/usr/local/lib$ ldd /usr/local/bin/libgsmd-tool
linux-gate.so.1 => (0xb7f3a000)
libgsmd.so.0 => /usr/local/lib/libgsmd.so.0 (0xb7f26000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dcb000)
/lib/ld-linux.so.2 (0xb7f3b000)
tank@debian:/usr/local/lib$
确实依赖这个库。
在/usr/local/lib下面找到这个库:
tank@debian:/usr/local/lib$ ls -l
总计 204
drwxr-sr-x 2 root staff 4096 11-20 09:49 gsmd
-rw-r--r-- 1 root staff 105846 11-20 09:49 libgsmd.a
-rwxr-xr-x 1 root staff 792 11-20 09:49 libgsmd.la
lrwxrwxrwx 1 root staff 16 11-20 09:49 libgsmd.so -> libgsmd.so.0.0.0
lrwxrwxrwx 1 root staff 16 11-20 09:49 libgsmd.so.0 -> libgsmd.so.0.0.0
-rwxr-xr-x 1 root staff 74400 11-20 09:49 libgsmd.so.0.0.0
drwxr-sr-x 2 root staff 4096 11-20 09:49 pkgconfig
drwxrwsr-x 3 root staff 4096 11-14 00:27 python2.5
tank@debian:/usr/local/lib$
一开始以为是编译问题,debian服务器用的是gcc4.3,同事编译使用gcc4.1.但换用gcc4.1也是不行。
想到是链接库的过程中出错了。
上网搜索:“error while loading shared libraries”
解决方法:
把libgsmd.so.0 所在lib位置加入到/etc/ld.so.conf文件当中
只要在/etc/ld.so.conf中加入/usr/local/lib这一行,就可以解決此问题,不仅仅是对于libreadline.so.5,大部分的so都存在
这/usr/local/lib这个目录里面。
最后将/etc/ld.so.conf保存后,还要执行ldconfig 才会使更改生效
++++++++++++++++++++++++++++++++++++++++
下面转帖网上的笔记,谢谢原创。
etc/ld.so.conf和ldconfig, PKG_CONFIG_PATH
2009-04-19 22:15
首先说下/etc/ld.so.conf: (可以这样想 ,link disk 连接路径)
这个文件记录了编译时使用的动态链接库的路径。
默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件
如果你安装了某些库,比如在安装gtk -2.4.13时它会需要glib-2.0 >= 2.4.0,辛苦的安装好glib后,没有指定 --prefix=/usr 这样glib库就装到了/usr/local下,而又没有在/etc/ld.so.conf中添加/usr/local/lib
这个搜索路径,所以编译gtk -2.4.13就会出错了
对于这种情况有两种方法解决:
一:在编译glib-2.4.x时,指定安装到/usr下,这样库文件就会放在/usr/lib中,gtk就不会找不到需要的库文件了
对于安装库文件来说,这是个好办法,这样也不用设置PKG_CONFIG_PATH了 (稍后说明)
二:将/usr/local/lib加入到/etc/ld.so.conf中,这样安装gtk时就会去搜索/usr/local/lib,同样可以找到需要的库
将/usr/local/lib加入到/etc/ld.so.conf也是必须的,这样以后安装东东到local下,就不会出现这样的问题了。
将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择 ^_^
添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:
include /etc/ld.so.conf.d/*.conf
添加一行:
/usr/local/lib
注:我在ld.so.conf.d 目录下的可以看到:
tank@debian:/etc/ld.so.conf.d$ vi libc.conf
1 # libc default configuration
2 /usr/local/lib
也就是说这个路径已经有了为何还要在/etc/ld.so.conf里添加?是否我只需要运行ldconfig。
再来看看ldconfig是个什么东东吧 :
它是一个程序,通常它位于/sbin下,是root用户使用的东东。具体作用及用法可以man ldconfig查到简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件 缓存到/etc/ld.so.cache 以供使用因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下/sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,结果
编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。 ^_^
我曾经编译KDE时就犯过这个错误,(它需要每编译好一个东东,都要运行一遍),所以
切记改动库文件后一定要运行一下ldconfig,在任何目录下运行都可以。
再来说说 PKG_CONFIG_PATH这个变量吧:
经常在论坛上看到有人问"为什么我已经安装了glib-2.4.x,但是编译gtk -2.4.x 还是提示glib版本太低阿?
为什么我安装了glib-2.4.x,还是提示找不到阿?。。。。。。"都是这个变量搞的鬼。
先来看一个编译过程中出现的错误 (编译gtk -2.4.13):
checking for pkg-config... /usr/bin/pkg-config
checking for glib-2.0 >= 2.4.0 atk >= 1.0.1 pango >= 1.4.0... Package glib-2.0 was not found in the pkg-config
search path.
Perhaps you should add the directory containing `glib-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'glib-2.0' found
configure: error: Library requirements (glib-2.0 >= 2.4.0 atk >= 1.0.1 pango >= 1.4.0) not met; consider adjusting
the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find
them.
很明显,上面这段说明,没有找到glib-2.4.x,并且提示应该将glib-2.0.pc加入到PKG_CONFIG_PATH下。
究竟这个pkg-config PKG_CONFIG_PATH glib-2.0.pc 是做什么的呢? let me tell you ^_^
先说说它是哪冒出来的,当安装了pkgconfig-x.x.x这个包后,就多出了pkg-config,它就是需要PKG_CONFIG_PATH的东东pkgconfig-x.x.x又是做什么的? 来看一段说明:
The pkgconfig package contains tools for passing the include path and/or library paths to build tools during the make file execution.pkg-config is a function that returns meta information for the specified library.The default setting for PKG_CONFIG_PATH is /usr/lib/pkgconfig because of the prefix we use to install pkgconfig.
You may add to PKG_CONFIG_PATH by exporting additional paths on your system where pkgconfig files areinstalled. Note that PKG_CONFIG_PATH is only needed when compiling packages, not during run-time.
我想看过这段说明后,你已经大概了解了它是做什么的吧。
其实pkg-config就是向configure程序提供系统信息的程序,比如软件的版本啦,库的版本啦,库的路径啦,等等这些信息只是在编译其间使用。你可以 ls /usr/lib/pkgconfig 下,会看到许多的*.pc,用文本编辑器打开
会发现类似下面的信息:
prefix=/usr
exec_prefix=$
libdir=$/lib
includedir=$/include
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: GLib
Description: C Utility Library
Version: 2.4.7
Libs: -L$ -lglib-2.0
Cflags: -I$/glib-2.0 -I$/glib-2.0/include
明白了吧,configure就是靠这些信息判断你的软件版本是否符合要求。并且得到这些东东所在的位置,要不去哪里找呀。
不用我说你也知道为什么会出现上面那些问题了吧。
解决的办法很简单,设定正确的PKG_CONFIG_PATH,假如将glib-2.x.x装到了/usr/local/下,那么glib-2.0.pc就会在/usr/local/lib/pkgconfig下,将这个路径添加到PKG_CONFIG_PATH下就可以啦。并且确保configure找到的是正确的
glib-2.0.pc,就是将其他的lib/pkgconfig目录glib-2.0.pc干掉就是啦。(如果有的话 ^-^)
设定好后可以加入到~/.bashrc中,例如:
PKG_CONFIG_PATH=/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:/usr/X11R6/lib/pkgconfig
[root@NEWLFS ~]#echo $PKG_CONFIG_PATH
/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:/usr/X11R6/lib/pkgconfig
从上面可以看出,安装库文件时,指定安装到/usr,是很有好处的,无论是/etc/ld.so.conf还是PKG_CONFIG_PATH
默认都会去搜索/usr/lib的,可以省下许多麻烦,不过从源码包管理上来说,都装在/usr下
管理是个问题,不如装在/usr/local下方便管理
其实只要设置好ld.so.conf,PKG_CONFIG_PATH路径后,就OK啦 ^_^
总结:关于在Linux下安装软件,有时候遇到的问题远不止就这样,但我相信,读过本篇文档之后,你会对linux下安装软件的过程有个全新的了解。
参考了一些网上资料,在此谢过作者,