从
源码
包安装软件最重要的就是仔细阅读
README INSTALL
等说明文件、它会告诉你怎样才能成功安装,通常从
源码
包安装软件的步骤是:
tar zxvf grass 6.2.2 *.tar.gz
解开
源码
包
cd grass6.2/
进入
源码
目录
./configure
似乎在某些环境下
./configure
会造成终端退出
而使用
. configure
则会正常运行
,
如果有这个现象,就试试
. configure
通过
configure
程序猜测主机信息,最终建立
Makefile,
以完成
make
,所以如果
./configure
不成功而去
make
的话
,
就会出现
"make: *** No targets specified and no makefile found. Stop."
make
当
./configure
成功结束后,就开始正式编译程序了
.
make install
编译成功后使用
make install
安装
make uninstall
某些软件支持卸载,可能使用该方法卸载,如果支持的话,通常会在
README
中写到
(
似乎比较少
)
configure
程序带有很多参数,可以通过
./configure --help
查看详细内容
,
通常位于前面的是常规
configure
的参数说明,末尾是该程序的可用参数说明。
./configure --prefix=/usr
指定安装目录,通常从
源码
包编译安装的软件默认会放在
/usr/local
,因为这是
FHS(Filesystem Hierarchy Standard)
的规定,不知道什么是
FHS
?看看这篇文章吧:
http://www.pathname.com/fhs/pub/fhs-2.3.html
相信它会让你对
linux
系统结构有更好的理解,很值得读读。
从源代码安装
GRASS
时需要注意的是
:
通过
rpm �Cqi tcl
他会自动查询是否安装
tcl
,并返回
tcl
的信息。同理
tk
,即使你安装了
tcltk,
编译的过程中也找不到这个头文件,我是下在了
tcl.
和
tk
的源码,自己编译安装(原不用卸载),这样在编译的过程中就可以自动找到了。
在编译安装
GRASS
的时候需要
gdal-config,
通过
rpm
包安装没有这个文件,所以你也需要自己下载
gdal
源代码包,自己编译安装。编译之后在
/usr/local/sbin/gdal-config
在编译
GRASS
时候就可以自动找到了。
在编译
GRASS
时候,需要数据库软件的支持,这个可以先不用。
在
./configure �Cwithout-postgres \
就可以暂时不用这个了。如果你要使用大栅格数据。在后面加入
�Cenable-largefile
1: CFLAGS=
”
-g �CWall
”
./configure �Cwith-gdal=/usr/local/sbin \
--without-postgres \
--enable-largefile \
--with-cxx \
--with-readline
Configure options and their meanings
For configure there are many options and some GRASS modules are built only if some options are set. Here are listed common configuration options with short explanation.
* --prefix=/path - Sets path where GRASS will be installed. GRASS will reside in /path/grass-version.
* --enable-largefile - Enables large (>2Gb on 32bit systems) support. For current large file support status look at Large File Support page.
* --with-cxx - Enables compilation of C++ code. Required for r.terraflow module.
* --with-readline - Enables readline support. If readline is enabled, you can use its history/editing facilities when entering r.mapcalc expressions on stdin.
* --with-glw - Enables GLw support. The GLw library provides OpenGL "canvas" widgets for Athena and Motif.
2 make
3 make install
4 make clean
5 make distclean
6 make libsclean
在编译之后,一些库可能会被
lock
,你需要在
/etc/Selinux/
将里面的一项改为
disabled
通过源代码安装会省去很多其他相关联的包,方便。我这次需要的都是从源代码包安装的。
再说一下几个关系到能否成功编译的东东:
/etc/ld.so.conf ldconfig PKG_CONFIG_PATH
首先说下
/etc/ld.so.conf:
这个文件记录了编译时使用的动态链接库的路径。默认情况下,编译器只会使用
/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
中是明智的选择
Mr. Green
添加方法也极其简单,将库文件的绝对路径直接写进去就
OK
了,一行一个。例如:
/usr/X11R6/lib
/usr/local/lib
/opt/lib
再来看看
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
库,去查看发现明明就在那放着,却找不到。
我曾经编译
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.
[root@NEWLFS gtk+-2.4.13]#
很明显,上面这段说明,没有找到
glib-2.4.x,
并且提示应该将
glib-2.0.pc
加入到
PKG_CONFIG_PATH
下。
究竟这个
pkg-config PKG_CONFIG_PATH glib-2.0.pc
是做什么的呢?先说说它是哪冒出来的,当安装了
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 are installed. 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=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/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${libdir} -lglib-2.0
Cflags: -I${includedir}/glib-2.0 -I${libdir}/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
中,例如:
[root@NEWLFS~]#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
啦
另外某些软件因为版本原因
(
比如
emacs-21.3)
,在
gcc-3.4.x
下编译无法成功
,(make
出错
)
使用低版本的
gcc
就可能编译通过。可能是因为
gcc-3.3.x
和
gcc-3.4.x
变化很大的缘故吧。暂时想到了这么多,先记下这些吧,如果你对
源码
包编译有了一点的了解,就不枉我打了这么半天字啦。
^_^
另外
./configure
通过,
make
出错,遇到这样的问题比较难办,只能凭经验查找原因,比如某个头文件没有找到,这时候要顺着出错的位置一行的一行往上找错,比如显示
xxxx.h no such file or directory
说明缺少头文件然后去
google
搜。或者找到感觉有价值的错误信息,拿到
google
去搜,往往会找到解决的办法。还是开始的那句话,要仔细看
README,INSTALL
程序如何安装,需要什么依赖文件,等等。
另外对于
newbie
来说,编译时,往往不知道是否成功编译通过,而编译没有通过就去
make install
必然会出错,增加了解决问题的复杂性,可以通过下面方法检查是否编译成功:
一:编译完成后,输入
echo $?
如果返回结果为
0,
则表示正常结束,否则就出错了
echo $?
表示
检查上一条命令的退出状态,程序正常退出
返回
0,
错误退出返回非
0
。
二:编译时,可以用
&&
连接命令,
&&
表示
"
当前一条命令正常结束,后面的命令才会执行
"
,就是
"
与
"
啦。这个办法很好,即节省时间,又可防止出错。例:
./configure --prefix=/usr && make && make install
欢迎大家指正并更新。
更新时间:
2009-7-7