用Ubuntu交叉编译静态的GTK库


GTK这个工程很大,编译起来很不方便,特别是静态编译.
在Windows下用Mingw和msys编译死慢死慢.(用bash.exe进行configure太慢了,还时不时跳个错误出来..)
所以我用Ubuntu交叉编译.configure相当的快.

jhbuild本为gnome这个庞大工程而生,编译GTK这方面也许只有它最方便了.用jhbuild的好处是不用自己来处理GTK的依赖关系了,编译可以一气呵成.
我编译的是GTK 2.16,我按这个页面的提示进行编译:http://live.gnome.org/GTK+/Win32/CrossCompilingJhbuild
GTK3都出来了怎么还编译2.16呢,其实3还不稳定,2.16是最稳定版本.而且跨平台编译的工程包只有2.16的.
我的系统是Ubuntu 11.04,编译安装在$home下.

首先安装mingw,可以直接安装:
sudo apt-get install mingw32
系统会自动处理依赖关系,自动下载另外两个包:mingw32-binutils  mingw32-runtime

然后安装jhbuild,其实系统也自带这个源,可以直接
sudo apt-get install jhbuild
注意它的网页上提醒是源码安装,会很麻烦的.

然后运行jhbuild,提示没有 $home/.jhbuildrc这个文件,新建一个就行,这个文件可以只有两行,主要是用来配置的.
checkoutroot = os.path.expanduser('~/checkout/gnome')
prefix = '/home/ww/gtkout' 
#这是我自己设置的目录,这个文件其实也没有什么用

然后下载jhbuild.mingw.gtk-2.16.tgz.这是工程包,不到1M,它会自动下载依赖的包.
http://live.gnome.org/GTK+/Win32/CrossCompilingJhbuild?action=AttachFile&do=view&target=jhbuild.mingw.gtk-2.16.tgz
在http://live.gnome.org/GTK+/Win32/CrossCompilingJhbuild这个页面有提示的.应该不会过期的.
解压它.解压之后就按照网页的说明来操作就行了,
我看了下这里面的文件,其实也就是像configure.in,configure,makefile这样一些脚本文件,这些脚本描述依赖关系....

tar xzf jhbuild.mingw.gtk-2.16.tgz
cd jhbuild.mingw.gtk-2.16
./cross-build-gtk-rls
它会自动下载zlib,png,glib,cairo,xml2,jpeg,iconv,pixman,atk,freetype,tiff,gtk等等.
很方便,比我以前自己乱编译好多了.
注意了zlib,gettext,和gtk-io都有补丁的!我想这也是我以前编译不成功的关键,(以前编译GTK库时压根没有在意补丁)
看一下gtk+-win32.jhbuildrc这个文件,就会发现有很多是disable的,如:--disable-gtk-doc
所以编译起来很快,编译用时仅仅十来分钟.(但是排错用了很久)

它用wget下载,这种下载很慢,其实也可以单独下载,看gtk+-win32.moduleset这个文件
找好版本号一个一个的下载,再把文件放到jhbuild.mingw.gtk-2.16/checkout.rls下就行了.注意版本一定要一样

GTK 2.16确实老了!
在下载过程中它会到zlib.net下载zlib 1.2.5.这个页面好像被墙了或者已经over了,下载不了.百度吧!
在下载过程中它还会下载pixman 0.19.2但是这个好像是废弃版本,下载页面已经把它给删了.不过可以用高版本代替.
直接复制pixman这个包还不行,因为配置文件带有md5验证(防止下载时出错的)
下载pixman 0.20.2(百度).再用系统自带的命令得到md5:
md5sum pixman-0.20.2
然后到$home/jhbuild.mingw.gtk-2.16/gtk+-win32.moduleset改md5值和文件名,(最好不要改version="0.19.2"这个)
类似这样的代码:
<tarball id="pixman" version="0.19.2">
    <source href="http://cairographics.org/releases/pixman-0.20.2.tar.gz" md5sum="a923c20af88e469ac29ba42cfedb88c2"/>
    <dependencies>
    </dependencies>
</tarball>

以前我是从头编译的,编译freetype,fontconfig,gettext,glib,cairo,pango.....
编译进程中还要注意环境变量还要设置 pkg-config路径和要一些麻烦的错误.一个编译不成功就不可能进行下一个.
单是理清它的依赖关系就头晕了......
所以用jhbuild还是很方便的.jhbuild本为gnome而生,编译GTK这方面也许只有它最方便了

如果以上编译成功了,就说明没有什么错误了.....(我编译过程中最后的demo没有完成)
现在看看怎么静态编译.
看看gtk+-win32.jhbuildrc
这个文件里面有这样一句:
autogenargs += ' --disable-static '
也就是它只编译动态库,改下就行了:
autogenargs += ' --enable-static --disable-shared'
但是编译会出错!要把GTK工程清理了重头编译才行(反正我编译过程中出错了...)
编译很顺利,但是到了GTK+也就是最后工程卡住了.....
glib,cairo,pango都成功了...就是GTK卡住了,说没有找到pango......
以后再考虑吧..

我现在在想可不可以替换gtk+-win32.moduleset这个文件里的内容,来编译GTK3!像替换pixman一样一个一个的替换嘛....
最麻烦的是补丁问题.....

相关内容