如题所示,GTK程序在Linux下开发,并且在Linux下编译。然后运行在Windows平台上。

前提条件:

<li>

工具链:i486-mingw32-gcc

工具链源代码由MinGW提供。MinGW官方网站上只提供了运行于Windows系统的编译器可执行文件。我们这里需要的是运行于Linux的可执行文件,所以需要从MinGW下载源码下来自己编译。编译方法很简单:

通常情况下,Linux发行版都提供了该预编译好的可执行文件,只需从其软件库里安装即可。

<li>GTK库

GTK库就简单多了,直接在GTK官方网站上下载即可。需要下载的是DEV开发包,而不是源代码或者是运行时环境。如果你不嫌麻烦,可以根据自己的需求下载GTK的各个组件。否则的话,也可以像我这样下载All-in-one bundles包。把下载到的软件包 解压缩到某个位置,比如/usr/gtk-runtime,记住这个目录。

<li>辅助工具:GNU make

辅助工具就不说了,Linux下开发基本上都有make。

安装环境已经具备,接下来无非就是配置编译参数了。请可以参考我的Makefile:

看上去有点复杂,其实分析起来很简单。

  • 首先CROSS_GTK_PATH就是定义GTK库依赖解压的地方。

  • CPP、CC就是编译出来的交叉编译工具的命令。

  • CFLAGS、LDFLAGS看上去也很复杂,但是来源很简单,只需要将GTK库依赖安装到某台Windows下,然后运行其中的bin/pkg-config gtk+-2.0 –cflags –libs就可以得到这个参数列表,然后对照着修改下路径就可以了。如果你没有Windows,并且也信得过我的,可以直接采用我这里的Makefile。

Makefile都搞定了,接下来随便搞一个源代码试试看了,我用的代码如下:

这里的源程序和Linux下的GTK程序没什么两样,唯一的区别就是第三行的submit_clicked_cb()函数,前面多了一个G_MODULE_EXPORT宏定义,这个宏定义的作用和Linux下GTK程序编译时添加-export-dynamic参数一样。就是将该函数的符号列表导出,以编译GtkBuilder在运行时寻找相应的回调函数。具体信息可以参考GTK文档中GtkBuilder章节的gtk-builder-connect-signals函数的说明

编译无误,打完收工!

如果你想直接借用这里的例子,请记住添加一个可用的Glade绘制出来的界面文件ui.glade,否则程序在终端(没错,就是那个命令提示符)输出Running as a daemon!后,就卡在那里了。

另外,如果要测试该程序的运行情况,请一定要在被测试的系统中安装GTK运行时刻,GTK运行时刻也是在前面所说的下载GTK库的地方下载,不过下载的包改成GTK运行时刻(Run-time)而已。具体可以参考我以前的文章Windows安装GTK运行时刻的方法