文档章节

在 Linux 系统上源码安装 GTK+ 2.0

openthings
 openthings
发布于 2015/03/21 20:09
字数 9215
阅读 1538
收藏 6

在 Linux 系统上源码安装 GTK+ 2.0
==================================================
Keywords: GTK+, Install, Linux, Source
Author:       whyglinux (whyglinux AT hotmail DOT com)
Date:          2007-01-07
==================================================
目录
0. 前言
1.
二进制安装和源码安装

2.
GTK+ 依赖软件包

3.
查看软件的版本号

4. 安装规划
  4.1 系统上未安装 GTK+
  4.2 系统上已安装 GTK+
5. 软件下载
6. 库的安装
  6.1 安装顺序
  6.2 安装过程
    6.2.1 解包
    6.2.2 配置
    6.2.3 构建
    6.2.4 安装
    6.2.5 设置
      6.2.5.1 搜索路径
      6.2.5.2 编译和连接界面
      6.2.5.3 pkg-config
      6.2.5.4 GTK+ 及其依赖库的设置
        6.2.5.4.1 以编译和连接为目的的设置
        6.2.5.4.2 以连接和执行为目的的设置
  6.3 其它库的安装
    6.3.1 安装 Atk
    6.3.2 安装 Cairo
    6.3.3 安装 Pango
    6.3.4 安装 Gtk+
7. 库的使用
  7.1 库使用之前的设置
  7.2 库文档
0. 前言
GTK+ 2.0 依赖的软件包(程序和库)比较多,版本的更新也比较频繁,所以如果想从 GTK+ 提供的源码软件包中构建一套较新或最新版本的
GTK+
库来使用的话,通常需要首先更新或者安装一系列新版本的依赖程序或库。同时,由于软件包之间存在着依赖关系,对软件包的版本和安装顺序都有一定的要求,一
般还需要对安装后的库进行一些必要的设置才能使用库。因而,可以说源码安装 GTK+ 是一项不小的工程。如果没有源码安装 GTK+
的经验,在安装过程中很容易遇到一些问题。对于新手来说,出现了安装问题时却往往不知道如何去解决。
本文试图对 GTK+ 的源码安装提供一套可行的解决方案,介绍一些安装和使用库方面的背景知识,对安装过程中容易出现问题的地方做了强调说明,以使安装过程能够顺利进行。这样,即使是一个从来没有安装过 GTK+ 的新手也能根据这里的说明顺利地安装上 GTK+。
1. 二进制安装和源码安装
需要首先说明的的是:对于 Linux 系统、特别是较新版本的 Linux 系统来说,其发行版中已经包含了 GTK+
和所有的支撑软件,一般来说默认安装后就可以直接使用 GTK+ 了。如果在安装的时候没有选择安装 GTK+,也可以用系统提供的安装工具将
GTK+ 添加到系统中来,或者下载已经编译好的 GTK+ 进行版本升级。
上面的安装方式使用的是已经编译好的软件包。由于这种安装一般会自动解决各个软件包之间的依赖关系,进而安装或者更新相应的软件包,所以与源码安装方式相
比,二进制包的安装节省了编译代码所需要的时间,避免了源码安装的种种繁琐易错之处,对于安装者的要求也较低,因此是安装 GTK+ 的首选方式。
二进制安装方式简单快捷,但也有其力所不及的地方:通常一个软件的二进制包的版本更新要落后于其最新版本,有些软件也可能没有二进制包提供。这样,要使用
最新的版本很可能源码安装就是唯一可以选择的方式了。有时人们也想体验或学习 GTK+
的源码安装方式,毕竟在开源盛世的今天,对于程序员来说源码安装也是必须要过的一关。
2. GTK+ 依赖软件包
GTK+ 的安装需要下面程序或者库的支持(可在列出的链接中找到各个软件包的下载地址):

  • C 编译器(如 GCC。GCC 的网站

  • X 窗口系统库(网站

  • pkg-config 工具(网站)

  • GNU make 工具(网站)

  • JPEG、PNG 以及 TIFF 图形库(下载页面 的 GTK+ Source 中的 dependencies 目录)

  • FreeType(网站

  • fontconfig 库(网站

  • GNU libiconv 库(当系统上没有 iconv() 函数的时候需要)(网站

  • GNU gettext 软件包(当系统上没有 gettext() 函数的时候需要)([url=http://www.gnu.org/software/gettext/网站[/url])

  • GLib 库(下载页面 的 GLib Source)

  • ATK 库(下载页面 的 GTK+ Source 中的 dependencies 目录)

  • Cairo 库(下载页面 的 GTK+ Source 中的 dependencies 目录)

  • Pango 库(下载页面 的 Pango Source)

  • GTK+ 库(下载页面 的 GTK+ Source)


目前(写此文时)最新的 GTK+ 是 2.10.6 版,我们就以这个版本为例介绍。当你看到这篇文章的时候,可能 GTK+ 又有了新的版本,所以要注意下载安装新版本的软件包。
其中,以上 1~9 各项是一些比较通用的软件,和 GTK+ 的关系也没有那么紧密--它们不但被 GTK+ 使用,也被其它程序或者库使用。即使系统上没有安装 GTK+,它们也可能已经在系统中存在了。
10~13 各项和 GTK+ 关系密切,更新也较快,通常一个 GTK+ 的版本会依赖于这些库的一些特定的版本。由于这些原因,在本文中说明
GTK+ 安装的时候认为 1~9 项已经安装好了,所以只涉及到 10~14 项的安装。也就是说,GTK+ 的安装实际上主要是
GLib、Atk、Cairo、Pango 和 Gtk+ 这五个库的安装。
当然,在你的系统 1~9 各项中也可能存在没有安装的情况,也可能存在由于版本过低从而使 GTK+
不能顺利安装的情况。当遇到这些情况的时候,应该参考各自的网站中的安装说明对软件进行安装或者升级。可以使用二进制包直接安装,也可以使用源码方式安
装。在本文中对这些软件的安装将不再叙述。
根据经验,只要系统中已经有了 1~9 各项,而且系统也较新的话,为了安装 GTK+ 一般没有必要把它们都升级到最新版本,除了其中的
pkg-config 工具。pkg-config 的变动较大,新版本的 GTK+ 的安装需要新版 pkg-config
的支持,否则可能会使安装过程失败。因此,要在安装 GTK+ 之前检查 pkg-config
的版本号。如果版本过低,一定要对它进行版本更新。至于 GTK+ 安装时对 pkg-config 的最低版本要求,可以在 GTK+ 下载目录的
dependencies 目录中找到对应的 pkg-config 软件包,从软件包上提供的版本信息中获得确认。
3. 查看软件的版本号
查看已经安装的软件的版本号的目的有二:

  • 检查软件是否存在

  • 获得软件的版本号,从中可以了解软件的新旧程度,是决定软件是否需要更新的依据


软件包大致可分为两种类型:程序和库。类型不同,查看版本号的方式也不同。
对于可运行的程序命令来说,查看版本号的方式是在执行命令后加上 --version 参数。例如,对于 pkg-config 来说,其过程是这样的:
$ pkg-config --version
上面的“$”符号表示命令行提示符。
注:你现在应该执行上面的命令查看 pkg-config 的版本号,并按照上面所述检查是否符合安装相应的 GTK+ 的最低版本要求。如果不符合要求,在进行下面的 GTK+ 及其依赖库的安装之前应该首先安装和更新 pkg-config。
对于库来说,如果它支持使用 pkg-config,则可以使用 pkg-config 来查看其版本号。例如,对于 GTK+ 2.0 库来说,可以这样:
$ pkg-config --modversion gtk+-2.0
注:不妨执行上面的命令看看 GTK+ 库是否已经在系统存在了;如果已经存在,注意它的版本号。还可以执行下面的命令查看使用 GTK+ 库时的编译和连接选项:
$ pkg-config --cflags --libs gtk+-2.0
通过显示出来的信息中的 -I 后面的路径可以大体知道 GTK+ 及其依赖库的安装位置。看看它们是不是都位于 /usr 目录下。
4. 安装规划
4.1 系统上未安装 GTK+
通过上面的检查,如果发现系统上没有安装 GTK+,那问题就变得简单了:直接将 GTK+ 及其依赖库安装到 /usr
目录下即可(至于如何把各个库的安装目录设置为 /usr,可参看下面有关的安装说明)。这样做的好处是:由于 /usr
是系统目录,几乎不需要对安装的库进行什么设置就能够马上使用它们。
/usr 是一个重要的系统目录,应该尽量避免对这个目录进行写操作。因此,建议源码安装 GTK+ 不要将它安装在 /usr 等系统目录下;可另选择一其它目录(具体参见下面的相关说明)。
4.2 系统上已安装 GTK+
如果系统中已经安装有 GTK+,要安装新版本的 GTK+ 时需要考虑的问题就多一些了。在 Linux 系统上使用的很多软件都是在 GTK+
库的支持下运行的(比如 GNOME 桌面)。如果相关的 GTK+
库发生损坏,或者库的版本发生了变化,轻微的可造成某些程序不能正常运行,严重的可能会给系统运行带来障碍(比如进入不了桌面环境,等等。)
因此,新版本的 GTK+ 的安装应该避免对原来的 GTK+ 造成影响,以保证系统的正常运行。这一点很容易做到:新版 GTK+
的安装目录要避免和已经存在的 GTK+ 的目录一致。比如,如果旧版的 GTK+ 安装在 /usr 目录下,新版 GTK+
在设置安装目录的时候最好就不要设置为 /usr 了。
一些人由于不了解这些情况,或者图方便,直接就把 GTK+ 安装在 /usr 中、从而把原来的 GTK+ 库给替换了。由于 GTK+
及其兼容库版本的变化以及可能在安装过程中产生的错误,很容易出现上面提到的问题,所以建议在安装新版 GTK+ 时,最好避开旧版 GTK+
所在的目录。
GTK+ 安装在什么目录中为好呢?其实,这没有什么定论,可自行设置安装的目录。不过,一般的源码软件包默认的安装目录是
/usr/local,所以可以把这个目录设置为 GTK+ 的安装目录,也可以是其它你认为合适的目录。在下面的示例安装中,我们使用的安装目录是
/opt/gtk,GTK+ 及其依赖库都将安装在这个目录下。
将 GTK+ 及其依赖库设置安装到同一个目录下(如 /opt/gtk)、而不是每一个库占用一个不同的目录,可以给以后的库的设置带来方便。而且,在将来不再需要这个版本的 GTK+ 及其依赖库的时候可以通过删除这个目录(如 /opt/gtk)将它们简单地去除。
和安装到 /usr 目录中不同,如果将库安装到一个非系统目录中(比如我们将要使用的 /opt/gtk 目录),只将库安装完成还是不够的,还必须要进行一些必要的设置才能使用这个新安装好的库。在下面的相关章节中讲对库的设置作具体说明。
5. 软件下载
按照上面“依赖软件包”一节中提供的说明和地址分别下载 GLib、Atk、Cairo、Pango、Gtk+ 这五个库。
在各自的下载目录中,通常列出了各种版本的软件包,而且一般每个版本都有 .tar.gz 和 .tar.bz2
两种不同压缩格式。要注意根据各个软件包的版本号或者日期选择一个最新的版本下载,有的库的下载目录下面也用一个 LATEST-xxx
的文件名告诉目前的最新版本是多少。由于 .tar.bz2 压缩格式的文件较小,推荐下载这种软件包;如果没有,再下载 .tar.gz 格式的包。
下面是目前各个库的最新版本的软件包:

  • glib-2.12.5.tar.bz2

  • atk-1.9.1.tar.bz2

  • cairo-1.2.0.tar.gz

  • pango-1.14.8.tar.bz2

  • gtk+-2.10.6.tar.bz2


可以新建一个目录,用于存放以上这些下载的软件包。
由于这些软件包都是使用 GNU Autotools 工具创建的,所以各个软件包的构建和安装界面是相同的,都是 ./configure
&& make && make install。因此,我们重点介绍 Glib 库的安装,对包括 GTK+
在内的其它库只作简单说明;在安装其它库的时候,可比照 Glib 库的安装过程进行。
6. 库的安装
6.1 安装顺序
根据依赖关系的要求,库的安装要按照这样的先后顺序进行:GLib、Atk、Cairo、Pango、Gtk+。
上述各个库在安装的时候,都会自动检查其依赖的库是否已经正确安装;如果依赖库没有安装,或者安装不成功,或者没有正确进行设置等都会导致安装终止,并显
示出相应的错误提示。不过,只要按照上面的顺序安装各个库,并严格按照下面的步骤操作,一般很容易在不出现任何错误的情况下顺利地完成各个库的安装。
6.2 安装过程
源码安装软件包的过程可划分为以下几个步骤:

  • 解包

  • 配置

  • 构建

  • 安装

  • 设置


下面以 Glib 的安装为例分别具体介绍库安装的各个过程。
6.2.1 解包
解包就是将软件包解压还原的过程。首先要进入软件包所在的目录,根据根据软件包的类型是 .tar.gz 还是 .tar.bz2,选择相应的解包命令。
.tar.bz2 格式软件包的解压还原:
$ tar xjvf glib-2.12.5.tar.bz2
如果软件包是 .tar.gz 格式的话,应该这样解压还原:
$ tar xzvf glib-2.12.5.tar.gz
上面的解包命令执行之后,会在当前工作目录下生成一个名为 glib-2.12.5 的目录,Glib 软件包的内容都存放在这个目录下。
其它软件包的解包过程与上面类似,只要把上面命令中的软件包名替换即可。各个软件包解包之后生成的目录名一般是将软件包名中的 .tar.bz2 或者 .tar.gz 去除之后的名称,其格式是:库名-版本号。
6.2.2 配置
配置(configure)的目的和结果是获得软件构建和安装所需要的
Makefile。为此,在配置过程中将对当前系统进行检测,获得程序构建和安装所需要的一些信息并最终记录在 Makefile
中。其中的一些内容也可以通过命令行参数进行指定,比如软件包的安装路径(如果不特意指定安装路径的话,将默认使用 /usr/local
作为安装路径。)
在前面已经规划好了:我们要将所有的软件包都安装在 /opt/gtk 目录下面,所以可以这样做:
首先进入要安装的软件包目录。例如,如果是 Glib,可以执行 cd glib-2.12.5 命令进入目录。
其次,执行下面的命令进行配置(以后安装的各个软件包的配置命令也是下面的形式):
$ ./configure --prefix=/opt/gtk
其中,configure 是在软件包中包含的一个脚本文件(是由 GNU Autotools 工具产生的),./configure
是执行这个脚本文件,用 --prefix 指明软件包的安装目录。这样,在随后的安装过程中(make
install)会把相应的文件拷贝到它后面指定的目录下(/opt/gtk)。
注:可以用 ./configure --help 命令查看各个软件包中配置时提供的不同的参数选项和各个参数的意义。
注:一个库可以有两种存在形态:共享库(.so)和静态库(.a)。对于 GTK+
及其依赖库,在源码安装的时候其默认设置是只生成共享库;如果需要静态库,应该在配置各个软件包的时候分别加上 --enable-static
参数(参见 ./configure --help)。开发 GTK 程序时一般应使用其共享库,可不安装静态库。
由于 Glib 只依赖于一些最基本的系统库,所以在执行配置的过程中应该不会出现任何问题才是。然而,对于
GTK+和其它依赖库,如果在配置过程中发现需要的程序或者库不存在,或者版本不符合要求,都会显示相应的错误提示后异常中止配置过程。如果配置不成功,
则不能继续进行下面的程序构建过程。
对新手来说,他们通常不清楚什么样的配置结果是成功的,什么是失败的。下面提供两种简单的检查配置是否成功的方法:

  • 配置过程中输出的信息,除了显示在屏幕上之外,还记录在一个名为 config.log 的文件中。检查这个文件中是否有
    configure: exit 0 这样的一句话(一般位于文件的后面部分或者最后一行)。如果是,说明配置成功;如果不是(比如
    configure: exit 1)说明配置过程中出现了错误,配置失败。

  • 在 ./configure 命令执行完毕后立即执行 echo $? 命令,检查它的输出结果。如果输出是 0,说明配置成功;0
    之外的数字说明配置失败。在 Linux 系统上,可以用这个方法检查一个命令或程序在其结束后返回给系统的值是多少。一般 0 代表成功,非 0
    表示程序异常退出。


6.2.3 构建
从源代码生成程序的过程称为构建(Build)。这里所说的“程序”是一个广义的概念:既可以是其一般意义上的二进制可执行程序(Program),也可
以是一个文本形式的可执行脚本(Script),还可以是库(Library)、头文件(Header)、数据(Data)等等。一个软件包中往往包含以
上一种或者多种形式的程序构建,其中以二进制可执行程序和库最为常见。
对于用编译型语言(如 C 或者 C++)写的程序来说(GTK+ 和它的一些依赖库就是用 C 语言写成的),软件的构建过程主要是编译和连接的过程。在 Linux 系统上,构建是通过执行 make 命令实现的:
$ make
make 是根据 Makefile 的内容来决定如何构建程序的,而这个 Makefile 就是上面配置的产物。执行 make 命令之后,程序的编译过程就开始了。这是一个比较耗时的过程,特别是对于一些大型的软件包(如 GTK+ 及其依赖库)来说更是这样。
make 结束后,也可以执行 echo $? 命令检查 make 是否执行成功。一般只要配置通过了,make 应该不会出现什么问题才是。
make 的结果,对于程序来说,主要生成的是可执行程序文件;对于库来说,主要生成的是库文件。下面的安装过程将把需要的文件拷贝到在配置时指定的安装目录中去。
6.2.4 安装
构建成功的软件包的安装是通过带 install 参数的 make 进行的:
$ make install
需要在此说明的是:在 Linux 系统,除了 root
用户和具有相应权限的用户之外,一般用户只有在自己的用户目录下才有写权限;对于用户目录之外的其它目录和文件,一般只能读而不能写。我们在配置的时候将
设置的安装目录是 /opt/gtk,对于一般用户来说是只读的。如果是这样的话,上面的 make install
虽然被执行,但是由于没有写的权限,不能向这个目录中拷贝文件,所以安装是不成功的。
一般需要如下面这样先切换到 root 用户,然后再进行安装:
$ su
# make install
上面的“#”符号表示处于 root 状态下的命令行提示符。
在执行完 make install 之后,也可以用 echo $? 检查是否执行安装成功。
如果此时查看 /opt/gtk 目录,你会发现这个目录下又有几个子目录,如 bin、include、lib、share。这是因为每个库(如
Glib)又根据使用目的不同将安装文件进行了划分:bin 是执行文件目录,include 是头文件目录,lib 是库文件目录,share
是库的公用目录,包括本地翻译文件、各种格式的说明文档和例子程序等。
安装完成后,应该立即退出 root 用户,返回到原来的用户状态:
# exit
root 用户权限应该仅在切实需要的时候才使用。很多初学者无论做什么都是以 root
进行,以为这样方便。其实对于新手而言这最是要不得,很容易由于误操作而损坏系统。即使只有你一个人使用一个 Linux
系统,也应该注册一个普通用户、平时以一个普通用户的身份使用系统。
6.2.5 设置
新手往往不清楚为什么要对库进行设置,要进行什么样的设置。为此,在下面介绍了一些有关库的设置的背景知识。如果已经了解了这部分内容,或者急于进行实际的设置操作,可直接转到最后一小节“GTK+ 及其依赖库的设置”。
6.2.5.1 搜索路径
上面的安装已经把库的各类文件拷贝到指定的安装目录中了,这个库也就可以被其它程序或者库来使用了。库的使用主要包括两方面的内容:对库的头文件的使用以
及对库文件(静态库或共享库)的使用。相应地,库的设置也就是如何对这两类文件进行定位的问题。对文件进行定位通常是用设置文件的搜索路径的方法来解决
的。在使用的过程中按照搜索路径的先后顺序查找,第一个找到文件将被使用。
库的头文件在程序中被包含使用,而且仅仅用在程序编译阶段,所以头文件的默认搜索路径是由编译器提供的。处于默认搜索路径内的头文件不需要进行搜索路径的
设置即可直接使用。虽然每个编译器提供的头文件的默认搜索路径不尽相同,但是都把 /usr/include
作为默认的搜索路径之一。使用处于默认搜索路径之外的头文件需要在编译的时候通过编译命令的 -I 参数指定其路径。这是对头文件进行定位的方式。
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和
/usr/lib
两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到
库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:

  • 在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。

  • 在 /etc/ld.so.conf 文件中添加库的搜索路径。


需要注意的是:第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是
因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache
从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf
中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root
权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行
/sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。
在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。
有的使用了共享库的程序,在编译和连接时都很顺利,但是在运行时却发生了找不到共享库的问题,其原因就是库的搜索路径没有设置,或者设置不正确。
6.2.5.2 编译和连接界面
一般来说,如果库的头文件不在 /usr/include 目录中,那么在编译的时候需要用 -I
参数指定其路径。由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安装在不同的目录下,所以即使使用同一个库,由于库的路径的
不同,造成了用 -I 参数指定的头文件的路径也可能不同,其结果就是造成了编译命令界面的不统一。如果使用 -L
参数,也会造成连接界面的不统一。编译和连接界面不统一会为库的使用带来麻烦。
为了解决编译和连接界面不统一的问题,人们找到了一些解决办法。其基本思想就是:事先把库的位置信息等保存起来,需要的时候再通过特定的工具将其中有用的
信息提取出来供编译和连接使用。这样,就可以做到编译和连接界面的一致性。其中,目前最为常用的库信息提取工具就是下面介绍的 pkg-config。
6.2.5.3 pkg-config
pkg-config 是通过库提供的一个 .pc 文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。这些信息可以通过 pkg-config 提供的参数单独提取出来直接供编译器和连接器使用。
在默认情况下,每个支持 pkg-config 的库对应的 .pc 文件在安装后都位于安装目录中的 lib/pkgconfig
目录下。例如,我们在上面已经将 Glib 安装在 /opt/gtk 目录下了,那么这个 Glib 库对应的 .pc 文件是
/opt/gtk/lib/pkgconfig 目录下一个叫 glib-2.0.pc 的文件(不妨看看这个文件的内容来获得对 .pc
文件的一些感性认识。)
使用 pkg-config 的 --cflags 参数可以给出在编译时所需要的选项,而 --libs 参数可以给出连接时的选项。例如,假设一个 sample.c 的程序用到了 Glib 库,就可以这样编译:
$ gcc -c `pkg-config --cflags glib-2.0` sample.c
然后这样连接:
$ gcc sample.o -o sample `pkg-config --libs glib-2.0`
或者上面两步也可以合并为以下一步:
$ gcc sample.c -o sample `pkg-config --cflags --libs glib-2.0`
可以看到:由于使用了 pkg-config 工具来获得库的选项,所以不论库安装在什么目录下,都可以使用相同的编译和连接命令,带来了编译和连接界面的统一。
使用 pkg-config 工具提取库的编译和连接参数有两个基本的前提:

  • 库本身在安装的时候必须提供一个相应的 .pc 文件。不这样做的库说明不支持 pkg-config 工具的使用。

  • pkg-config 必须知道要到哪里去寻找此 .pc 文件。


GTK+ 及其依赖库支持使用 pkg-config 工具,所以剩下的问题就是如何告诉 pkg-config 到哪里去寻找库对应的 .pc 文件,这也是通过设置搜索路径来解决的。
6.2.5.4 GTK+ 及其依赖库的设置
6.2.5.4.1 以编译和连接为目的的设置
对于支持 pkg-config 工具的 GTK+ 及其依赖库来说,库的头文件的搜索路径的设置变成了对 .pc 文件搜索路径的设置。.pc
文件的搜索路径是通过环境变量 PKG_CONFIG_PATH 来设置的,pkg-config 将按照设置路径的先后顺序进行搜索,直到找到指定的
.pc 文件为止。
Linux 中环境变量的设置方式和使用的 shell 有关。在这里是以 bash 为例进行说明的。如果你发现这里的环境变量的设置方法不能成功的话,应该检查你在当前的终端中使用的是什么 shell:
$ ps --no-headers --format comm $$
注:如果 ps 被定义为别名,可能需要执行 \ps --no-headers --format comm $$ 才行。
然后根据这种 shell 的环境变量的设置方法进行设置。如果系统中存在有 bash 的话,也可以将 shell 切换为 bash:
$ bash
这样就可以按照下面介绍的方法设置环境变量了。
安装完 Glib 后,在 bash 中应该进行如下设置:
$ export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH
可以执行下面的命令检查是否 /opt/gtk/lib/pkgconfig 路径已经设置在 PKG_CONFIG_PATH 环境变量中:
$ echo $PKG_CONFIG_PATH
这样设置之后,使用 Glib 库的其它程序或库在编译的时候 pkg-config 就知道首先要到 /opt/gtk/lib/pkgconfig
这个目录中去寻找 glib-2.0.pc 了(GTK+ 和其它的依赖库的 .pc 文件也将拷贝到这里,也会首先到这里搜索它们对应的 .pc
文件)。之后,通过 pkg-config 就可以把其中库的编译和连接参数提取出来供程序在编译和连接时使用。
另外还需要注意的是:环境变量的设置只对当前的终端窗口有效。如果到了没有进行上述设置的终端窗口中,pkg-config 将找不到新安装的 glib-2.0.pc 文件、从而可能使后面进行的安装(如 Glib 之后的 Atk 的安装)无法进行。
6.2.5.4.2 以连接和执行为目的的设置
前面已经说明过了,库搜索路径的设置有两种方式:在环境变量 LD_LIBRARY_PATH 中设置以及在 /etc/ld.so.conf 文件中设置。
其中,第二种设置方式需要 root 权限,以改变 /etc/ld.so.conf 文件并执行 /sbin/ldconfig
命令。而且,当系统重新启动后,所有的基于 GTK2 的程序在运行时都将使用新安装的 GTK+ 库。不幸的是,由于 GTK+
版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。
为了避免出现上面的这些情况,在 GTK+ 及其依赖库的安装过程中对于库的搜索路径的设置将采用第一种方式进行。这种设置方式不需要 root 权限,设置也简单:
$ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容:
$ echo $LD_LIBRARY_PATH
至此,库的两种设置就完成了。
由于我们将 GTK+ 及其依赖库设置安装在同一目录中,所以上面的对环境变量 PKG_CONFIG_PATH 和 LD_LIBRAY_PATH 的设置在一个终端窗口中只要进行一次就可以了,以后安装其它库的时候不需要再行设置。
经过以上设置之后,使用了 Glib 的程序(如下面要安装的 Atk)就能够根据在 PKG_CONFIG_PATH 和
LD_LIBRAY_PATH 中设置的搜索路径找到新安装的 Glib 库了。如果不进行上面的设置,或者设置有误,可能找到的是旧版的
Glib,也可能出现找不到 Glib 的错误。
现在,可以执行下面的命令检查 Glib 的版本号:
$ pkg-config --modversion glib-2.0
如果显示的版本号和你进行安装的软件包中的版本号一致,那么恭喜你! 你已经成功地完成了 Glib 库的安装和设置,可以继续进行其它库的安装了。
注意:Atk 等库的编译会用到 /opt/gtk/bin 中的命令,所以还应该对 PATH 环境变量进行如下设置:
$ export PATH=/opt/gtk/bin:$PATH
6.3 其它库的安装
在确认已经成功安装了 Glib 之后,可以顺次安装其它的库。
6.3.1 安装 Atk
参考“安装 Glib”一节中的操作进行。如果始终在同一个终端窗口中操作的话,最后的设置过程可不执行。检查 Atk 的版本号:
$ pkg-config --modversion atk
6.3.2 安装 Cairo
参考“安装 Glib”一节中的操作进行。如果始终在同一个终端窗口中操作的话,最后的设置过程可不执行。检查 Cairo 的版本号:
$ pkg-config --modversion cairo
6.3.3 安装 Pango
参考“安装 Glib”一节中的操作进行。如果始终在同一个终端窗口中操作的话,最后的设置过程可不执行。检查 Pango 的版本号:
$ pkg-config --modversion pango
注意:配置 Pango 成功的另外一个标志是:在 ./configure 最后显示出来的一行信息 backends: FreeType X
Xft Cairo 中应该有 Cairo 字样的出现。如果没有,比如象 backends: FreeType X Xft 这样,说明
Pango 的配置不成功;Pango 配置不成功,说明其依赖库 Cairo 没有安装或者 Cairo 库的设置不正确。
6.3.4 安装 Gtk+
参考“安装 Glib”一节中的操作进行。如果始终在同一个终端窗口中操作的话,最后的设置过程可不执行。检查 GTK+ 的版本号:
$ pkg-config --modversion gtk+-2.0
7. 库的使用
7.1 库使用之前的设置
在我们采用的安装方案中,由于是使用环境变量对 GTK+ 及其依赖库进行的设置,所以当系统重新启动、或者新开一个终端窗口之后,如果想使用新安装的
GTK+ 库,需要如上面那样重新设置 PKG_CONFIG_PATH 和 LD_LIBRARY_PATH 环境变量。
这种使用 GTK+ 的方法,在使用之前多了一个对库进行设置的过程。虽然显得稍微繁琐了一些,但却是一种最安全的使用 GTK+ 库的方式,不会对系统上已经存在的使用了 GTK+ 库的程序(比如 GNOME 桌面)带来任何冲击。
为了使库的设置变得简单一些,可以把下面的这两句设置保存到一个文件中(比如 set_gtk-2.10 文件):
export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
之后,就可以用下面的方法进行库的设置了(其中的 source 命令也可以用 . 代替):
$ source set_gtk-2.10
只有在用新版的 GTK+ 库开发应用程序、或者运行使用了新版 GTK+ 库的程序的时候,才有必要进行上述设置。
如果想避免使用 GTK+ 库之前上述设置的麻烦,可以把上面两个环境变量的设置在系统的配置文件中(如
/etc/profile)或者自己的用户配置文件中(如 ~/.bash_profile) ;库的搜索路径也可以设置在
/etc/ld.so.conf 文件中,等等。这种设置在系统启动时会生效,从而会导致使用 GTK+ 的程序使用新版的 GTK+
运行库,这有可能会带来一些问题。当然,如果你发现用新版的 GTK+ 代替旧版没有什么问题的话,使用这种设置方式是比较方便的。
7.2 库文档
使用一个库免不了要参考库的文档。GTK+ 及其依赖库的各个库的参看文档也被安装,具体位置在安装目录的 share/gtk-doc/html 目录下分别存放。可以用浏览器分别打开每个目录中的 index.html,然后将其添加到网络书签中以便随时参考。
(完)


本文转载自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2060639

openthings
粉丝 325
博文 1140
码字总数 689435
作品 1
东城
架构师
私信 提问
Linux下 GTK+ 安装

今天在Linux上安装 GTK+,我下载的gtk+-3.2.0.tar.bz2 。按官网的说明要提前安装"GLib, Pango, Gdk-Pixbuf, ATK"这几个包,我查了下系统都有。 结果./configure --prefix=/usr 之后报错 chec...

jingweiyoung
2012/07/05
12K
5
安装bochs并配置linux0.11

一、安装bochs 在bochs.sourceforge.net下载bochs源代码包并解压缩 ./configure --enable-debugger --enable-disasm 出现错误一: ERROR: pkg-config was not found, or unable to access t......

acmfly
2012/05/26
772
0
Fedora Core下 GTK+开发包安装过程介绍

基本package:   gtk+ 是基于以下三个库开发的:   glib:gtk+与gnome的底层核心库,主要提供了C数据结构、可移植封装、运行时功能接口,譬如事件循环、多线程、动态装载和对象机制等; ...

范堡
2009/05/08
865
0
Kali Linux2019.2 使用 fcitx 安装搜狗输入法失败,报 fcitx-frontend-gtk2安装失败,GLib version too old

大家好, 今天使用虚拟机(Mac Parallels)安装了 Kali Linux 2019.2 最新版,然后尝试安装 搜狗输入法,老是报错: Cannot load module /usr/lib/x8664-linux-gnu/gtk-2.0/2.10.0/immodules...

山哥
08/31
195
1
理解 pkg-config 工具

你在 Unix 或 Linux 下开发过软件吗?写完一个程序,编译运行完全正常,在你本机上工作得好好的,你放到源代码管理系统中。然后,告诉你的同事说,你可以取下来用了。这时,你长长的出了一口...

j_m
2012/07/10
50
0

没有更多内容

加载失败,请刷新页面

加载更多

带你了解 Java内存模型

Java内存模型的规定: 1、所有变量存储在主内存中; 2、每个线程都有自己的工作内存,且对变量的操作都是在工作内存中进行; 3、不同线程之间无法直接访问彼此工作内存中的变量,要想访问只能...

linux-tao
18分钟前
3
0
.net c# datetime转string 时间转字符串

.net c# datetime转string 时间转字符串 .net c# datetime转string 时间转字符串 刚开始接触net 时间转换字符串 一搜索出来的全是 字符串转时间,要么就是系统当前时间转字符串 就没有一个指...

青峰Jun19er
19分钟前
3
0
hbase demo

HbaseDao public class HbaseDao {@Testpublic void insertTest() throws Exception {Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.qu......

Garphy
29分钟前
2
0
IT兄弟连 HTML5教程 HTML5表单 多样的输入类型2

4 range range类型用于包含一定范围内数字值的输入域,跟number一样,我们还可以对数值设置限定,range类型显示为滑动条用法如下: 上述代码使用了range类型输入框,为该类型设置了数值范围为...

老码农的一亩三分地
29分钟前
2
0
对比不同的数据库连接的异同

博主在学习和使用数据库连接时,遇到的问题, 这个几个数据库连接究竟有什么不同? 到底什么时候该使用哪个会更好一点? 带着这个问题我们先去了解常见的数据库连接 1. 常见的数据库连接有哪些?...

理性思考
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部