gtk+/x11

来源:互联网 发布:编程判断闰年 编辑:程序博客网 时间:2024/05/01 19:28

    最近对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"

    提示系统没有flexbison这两个工具。简单查了一下相关资料,好像可以用来词法以及
文法解析,可以根据规则生成源代码等等。找机会准备看一下。
有兴趣的话可以参考下面的网站:
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 <stdlib.h>
#include <stdio.h>
#include <linux/joystick.h>

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 <linux/joystick.h>
#define __STRICT_ANSI__
-----------------------------------------------------

5.      checking if <X11/extensions/XIproto.h> is needed for xReply... unknow
configure: error: xReply type unavailable. X11 is too old
我是把Xwindow安装在/usr/X11目录的。

在安装完众多的 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

原创粉丝点击