Pages

Tuesday, 25 March 2014

No package 'fuse' found

Package fuse was not found in the pkg-config search path.
Perhaps you should add the directory containing `fuse.pc'
to the PKG_CONFIG_PATH environment variable
No package 'fuse' found

在linux上编程时,很多时候会用到一些非标准的库(即自己装上去的库),这些非标准的库安装位置可能不尽相同,这就给我们编写程序时带来了麻烦。
本文就是旨在替和我一样的菜鸟解决这一问题,水平有限,行文难免谬误,望大虾们不吝赐教。

在linux上编程时,很多时候会用到一些非标准的库(即自己装上去的库),这些非标准的库安装位置可能不尽相同,这就给我们编写程序时带来了麻烦。
本文就是旨在替和我一样的菜鸟解决这一问题,水平有限,行文难免谬误,望大虾们不吝赐教。

1。头文件的位置
gcc 默认会在 /usr/include目录下寻找头文件,这是标准库的头文件的路径,但非标准的库一般不会把头文件直接放在该目录下,一般的作法是在该目录下创建一个 自己的目录,然后在此目录下直接或分门别类(即再创建更深层次的目录,gtk+即一例证)放自己的头文件。如果是这样,gcc编译时是不会找到这些头文件 的,我们会看到有“×××: No such file or directory”的出错信息。解决的方法就是用gcc的-I选项列出这些非标准的路径(实际编程当中一般是由pkg-config --cflags 完成这一工作的)。
2。库的位置
gcc默认会链接标准c语言库,但如果所用的库是“舶来品”,gcc自然不会自动链接,如果也没有显式链接的话,在链接阶段就会出现诸如“: undefined reference to `gtk_container_set_border_width'
/tmp/ccvHaxUx.o(.text+0x1af): In function `main':”的错误。解决的方法就是利用gcc的-l参数显式链接需要链接的库。这样gcc就会按照一种特定的命名规则到默认的目录 (/usr/lib和/lib等目录)下去寻找这些库,并自动链接。但如果库放在自己的定义的目录下,gcc还是不能找到的,这种情况下可以用gcc -L来列出非标准库的路径。实际编程中这一工作是由pkg-config --libs完成的。
上面两次提到pkg-config命令,各位可能就会有疑问了:难道pkg-config前知八百年,后知八百年,无所不能?非也,其实pkg-config也有自己的一套规则来提供关于所查询库的信息
当 要查询指定库(如gtk+-2.0库)的信息时,我们要以gtk+-2.0为参数运行pkg-config命令(如pkg-config --libs --cflags gtk+-2.0)。此时,pkg-config会到默认目录(如/usr/lib/pkgconfig目录)以及PKG_CONFIG_PATH指定的 目录去找一个配置文件,该文件就记录了所查询的库在该系统上信息。该配置文件的命名规则是:所查询库的名字加上后缀.pc。若要查询gtk+-2.0的信 息,则pkg-config会按上面所说的寻找gtk+-2.0.pc。如果找到,万事大吉,直接根据找到的文件的内容显式库的信息。如果找不到以.pc 为后缀的配置文件,则显示出错信息提示用户继续寻找。例如:
代码:[leo@leo ~]$ pkg-config --libs --cflags gtkmm-2.0
Package gtkmm-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtkmm-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gtkmm-2.0' found这就有两种可能:一是gtkmm-2.0.pc没有放在/usr/lib/pkg-config下。二就是gtkmm-2.0根本就没有装。
对 应的解决方法:第一种情况直接用find,locate等命令把gtkmm-2.0.pc找出来,把路径加入环境变量PKG_CONFIG_PATH 中,再运行命令pkg-config --libs --cflags gtkmm-2.0。第二种情况就只能安装gtkmm-2.0库了。
关pkg-config的更详细的用法请参加pkg-config的manpage:)

如前所述,当显式链接库时,gcc会按自己的规则去寻找库的名字,现在就来说说库的命名规则。
系 统中的库分两类,静态库和动态库(关于动态库和静态库的区别以及如何添加自己的库,我想需要用另一篇文章来专门叙述了,以后有时间再详细写下来吧)。静 态库和动态库在命名上的区别就是后缀名不同而已。动态库以.so(意为shared object)结尾,而静态库一.a(意为archive)结尾。由于种种原因,链接时是优先链接动态库的,如果不成功,则链接静态库。
除了有相区别的后缀外,动态和静态库都有相同的前缀lib,这样动态库就有形如libXX.so的形式,相应的,静态库的名字看起来会是这样libXX.a。
比如,用-lm参数链接数学库时,gcc就会去寻找libm.so或libm.a
-------------------------------
 编译fuse

FUSE是用户空间文件系统的简称,使用Fuse,您可以在用户空间创建功能完备的文件系统,而无需具备内核编程的知识。目前的Linux发行版本大多都默认安装了FUSE,不过今天我们要下载最新的源代码进行安装。

 wget http://sourceforge.net/projects/fuse/files/fuse-2.X/2.8.3/fuse-2.8.3.tar.gz
tar zxvf fuse-2.8.3.tar.gz
cd fuse-2.8.3
./configure --prefix=/usr
make
make install
modprobe fuse (意思是加载fuse.ko模块)

http://fuse.sourceforge.net/,  http://sourceforge.net/projects/fuse/