最近对GTK+/X11进行了PC编译,经过几天的反复终于完成了,下面把过程和大家分享一下。
个人主要参考李先静老师的http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Fabsurd这篇文章。
流程和也李老师的差不多。下面我就说一下具体的编译方式及软件版本
我用的是GTK+和XFree86的X11实现。x.org的免费而且比较新但是编译比较麻烦,包的依赖比较多,编译没有成功,所以就选用这个了。
我用的Fedora core 8 32 bit版本作为实验机(最小化安装不安装X 和GNOME)。XFree86-4.5 libpng-1.2.40.tar jpegsrc.v7.tar freetype-2.3.9.tar fontconfig-2.4.2.tar glib-2.14.2.tar cairo-1.4.10.tar pango-1.18.3.tar fluxbox-1.0.0.tar atk-1.20.0.tar gtk+-2.12.1.tar (基本上就是fedora core 8的软件包,不用再自己探索一套)应该还依赖pixman pkg-config但是因为安装FC的时候没有取消了他的选项,就用系统的了,先实现我们的第一步。
export PKG_CONFIG_PATH=/buildgtk/lib/pkgconfig:/usr/X11R6/lib/pkgconfig
export LD_LIBRARY_PATH=/buildgtk/lib:/usr/X11R6/lib
export CFLAGS=-g
因为XFree86-4.5用的是Imake不是autoconfig automake所以不大熟悉不知道该怎么确定他的安装路径,就把/usr/X11R6路径也加上了。
这里先说一下linux上很多软件使用pkg-config工具来确定编译和链接的头文件路径和库路径,库编译完成之后一般安装在lib下,lib下面会有一个pkgconfig路径就是供pkgconfig文件存放的地方。pkg-config工具查找.pc文件的时候首先会从PKG_CONFIG_PATH环境变量路径里查找是否有你要找的库对应的.pc文件。LD_LIBRARY_PATH是程序运行的时候查找库的搜索路径。如果不想设置这个环境变量可以在/etc/ld.so.conf里面加上你的库所在的位置然后执行/sbin/ldconfig更新/etc/ld.so.cache就可以了。
下面开始进行build
1.首先把所有的包都解压了
2.安装libpng 、freetype 和 libjpeg比较简单在此略过。
3.安装xfree86 4.5
解压下载的7个包后生成一个xc文件夹
cd xc/config/util/
make -f Makefile.ini lndir
cd ../../../ //退到和xc平行的那一层文件夹
mkdir build
cd build
../xc/config/util/lndir ../xc
cd config/cf/
cp TinyX.cf host.def
编辑host.def,做如下修改:
1).把#define TinyXServer YES放到注释外来。
2).#define BuildLBX YES
3).#define BuildFonts YES
cd ../../
make World //如果中间有错误修改以后直接make就行了不用在执行make World否则你就会陷入无尽的build
make install
4.编译glib也比较简单。略过
5.创建文件:/usr/X11R6/lib/pkgconfig/xrender.pc,其内容如下:
prefix=/usr/X11R6
exec_prefix=/usr/X11R6/bin
libdir=/usr/X11R6/lib
hardcode_libdir_flag_spec=
includedir=/usr/X11R6/include
Name: Xrender
Description: X Xrender library
Version: 1.2.0
Requires:
Libs: ${hardcode_libdir_flag_spec} -L${libdir} -lXrender
Cflags: -I${includedir}
说明:安装TinyX后,并没有生成xrender.pc,查看了一下相关的库和头文件,都是正常的。Cairo通过xrender.pc去检查Xlib相关设置,于是手工编辑了这个文件,以使cairo的configure不会出错。
6.安装fontconfig
./configure
make
make install
6.安装cairo
./configure --with-x --disable-win32
make
make install
7.安装pango
./configure --with-x
make
make install
8.安装atk
./configure
make
make install
9.安装gtk
./configure --with-x --without-libtiff
make
make install
10.安装fluxbox
./configure
make
make install
至此安装完成运行gtk-demo查看结果
中间有更改错误的一些小方法
1.“...linux/config.h: No such file or directory”
原因是Linux内核从2.6.19版本开始,就已经将头文件include/linux/config.h删除了。
那么依据2.2.19以前的内核版本的工程在编译的时候就会理所当然出现该错误。
事实上就算找到该头文件,会发现文件中差不多就包含下面这句注释:
This file is no longer in use and kept only for backward compatibility.
因此解决这个问题只需要在include/linux下做一个名为config.h的空文件就可以了
2."flex: not found" "bison: not found"
提示系统没有flex和bison这两个工具。简单查了一下相关资料,好像可以用来词法以及
文法解析,可以根据规则生成源代码等等。找机会准备看一下。
有兴趣的话可以参考下面的网站:
http://www.mi.s.osakafu-u.ac.jp/~kada/course-kitami/j3_03/index.html
解决很简单。下载这两个工具并装起来就行。
3.arm-linux-gcc: os/tiny/lbxio.o: No such file or directory
cd programs/Xserver/os/tiny
make lbxio.o
cd -
make
make install DESTDIR=$ROOTFS_DIR
4. "/usr/include/linux/joystick.h:131: error: expected
specifier-qualifier-list before ‘__s64’"
在被joystick.h包括的其中一个头文件types.h中有如下的代码:
-----------------------------------------------------
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef __signed__ long long __s64;
typedef unsigned long long __u64;
#endif
-----------------------------------------------------
可见,如果编译开关已定义__GNUC__并且未定义__STRICT_ANSI__则定义__s64的数据类
型。但是在joystick.h文件或者被它引用的某个文件中,明显定义了__STRICT_ANSI__宏。
下面的小程序可以显示这一点:
-----------------------------------------------------
#include
#include
#include
main() {
#if defined(__GNUC__)
printf("__GNUC__ is defined/n");
#else
printf("__GNUC__ is NOT defined/n");
#endif
#if defined(__STRICT_ANSI__)
printf("__STRICT_ANSI__ is defined/n");
#else
printf("__STRICT_ANSI__ is NOT defined/n");
#endif
}
-------------------------------
__GNUC__ is defined
__STRICT_ANSI__ is NOT defined
-----------------------------------------------------
解决的办法也不难,根据make的提示信息,确定joystick.h文件被哪个文件引用。在该文
件包含joystick.h处,加入代码如下所示:
-----------------------------------------------------
#undef __STRICT_ANSI__
#include
#define __STRICT_ANSI__
-----------------------------------------------------
5. checking if
configure: error: xReply type unavailable. X11 is too old
在安装完众多的 Xorg Libraries, 忘了创建两个链接:
ln -sv $XORG_PREFIX/lib/X11 /usr/lib/X11 &&
ln -sv $XORG_PREFIX/include/X11 /usr/include/X11
6. 用此命令可以查看系统里面的软件的版本。
echo pkg-config --modversion atk
pkg-config --modversion atk
echo pkg-config --modversion cairo
pkg-config --modversion cairo
echo pkg-config --modversion pango
pkg-config --modversion pango
echo pkg-config --modversion gtk+-2.0
pkg-config --modversion gtk+-2.0
echo pkg-config --modversion fontconfig
pkg-config --modversion fontconfig
echo pkg-config --modversion glib-2.0
pkg-config --modversion glib-2.0
echo pkg-config --modversion libxml-2.0
pkg-config --modversion libxml-2.0
echo pkg-config --modversion freetype2
pkg-config --modversion freetype2
echo pkg-config --modversion pixman-1
pkg-config --modversion pixman-1