Chinaunix首页 | 论坛 | 博客
  • 博客访问: 515770
  • 博文数量: 174
  • 博客积分: 8001
  • 博客等级: 中将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-04 19:30
文章分类

全部博文(174)

文章存档

2011年(1)

2010年(24)

2009年(149)

我的朋友

分类: LINUX

2009-05-04 10:35:25

有时候,你会觉得:Linux安装文件实在是很麻烦——而且卸载也十分的麻烦?(现在的我几乎不考虑卸载,导致虚拟机只剩下了500M的空间)。但是Linux下安装文件并不是无法可依的,毕竟linux是给程序员用的。程序员要确定头文件,要确定库,安装文件并没有windosws的install shell,它要你把指定的文件放在合适的地方。
PS:
我们这里讲的是TARBALL,也就是将源代码打包,并且提供下面所说的三种机制的tar.gz或tar.bz2等格式,而不涉及RPM的安装。

一般的步骤是:
configure/make/make install
这几个步骤一般有什么用呢?

这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。
./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。
make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

基本上改动的地方时配置的时候,而且基本上改动的地方是
--prefix=PREFIX         install architecture-independent files in PREFIX
cs.Phontol.com[/usr/local]
为什么需要改动这个地方呢?
这是因为安装到指定目录,这样可以方便使用,而且如果要卸载,把该目录删除即可。

*./configure
Linux下那么多库,在./configure时时怎么判断它们存不存在的?
通过PKG_CONFIG_PATH定义的路径,一个pkgconfig目录下的.pc文件。这些文件列出了有关于一个库的详细信息。例如:
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/liboil-0.3
toolsdir=${exec_prefix}/bin


Name: liboil-0.3
Description: Library of Optimized Inner Loops
Version: 0.3.12
Libs: -L${libdir} -loil-0.3 -lm
Cflags: -I${includedir}

Version:提供了库的版本;Libs:提供了需要的库文件;Cflages:提供了需要的头文件。

pkg-config是相应的系统命令。当我们编译一个使用库的程序的时候,如果手工一一指定需要的库文件和头文件的位置,将是一件很乏味和易错的事情。例如使用gstreamer库的时候,需要
(PS:下面的只是作为例子,应该在具体的路径上有错。)
-I/usr/local/include/gstreamer-0.10 
(PS:也许这个我们事先可以预料到要包含我们使用的库的头文件)
-I/usr/include/glib-2.0 
(PS:也许如果我们知道gstreamer是基于glib,我们也可以预料到这个)
-I/usr/lib/glib-2.0/include 
(PS:也许我们知道glib还有一个lib的头文件,还可以预料到这个)
-I/usr/include/libxml2
(PS:如果你对gstreamer的代码熟悉的话,你可以预料到这个,但是你可能对每个库的代码熟悉吗?)
同样的情况对于动态库而言。
所以pkg-config提供了这样的机制,方便了我们写程序时使用这个库而获得这个库的gcc选项:

pkg-config is a helper tool used when compiling applications and libraries. It helps you insert the correct compiler options on the command line so an application can use  gcc -o test test.c `pkg-config --libs --cflags glib-2.0`  for instance, rather than hard-coding values on where to find glib (or other libraries). It is language-agnostic, so it can be used for defining the location of documentation tools, for instance. 

这样使用脚本,可以方便的使用库文件:
#!/bin/sh
export TARGET=hello.out
export SOURCE=hello.c
export PKG0=gstreamer-0.10
export USEPKG0=`pkg-config --libs --cflags $PKG0` 
echo `pkg-config --libs --cflags $PKG0` 
export CC=gcc
$CC $OPT -Wall -o $TARGET $SOURCE $USEPKG0

PS:要确定一个包的名字,例如:
pkg-config --list-all|grep gstreamer

前面说过.pc文件提供了版本信息,因为./configure有时候需要检查库的版本是否足够。


安装动态库之后,本来系统默认的编译时使用的动态链接库的路径只会使用/lib和/usr/lib这两个目录下的库文件如果你安装了某些库,比如在安装gtk+-2.4.13时它会需要glib-2.0 >= 2.4.0,如果没有指定 --prefix=/usr 这样glib库就装到了/usr/local下,而又没有在/etc/ld.so.conf中添加/usr/local/lib,运行的时候会报错:找不到xx库。
解决方法是在/etc/ld.so.config中添加/usr/local/lib
然后ldconf
不过现在我这里出现了not a symbol linkd的问题?
待续。。。


阅读(823) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~