QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2712|回复: 0

在Cygwin上建立GTK+开发环境

[复制链接]
发表于 2004-7-21 21:28:47 | 显示全部楼层 |阅读模式
声明:作者同意将本文自由传播,但不得删改包括本声明及以下呼吁在内的任何内容。

呼吁:宪法第一条“中华人民共和国是工人阶级领导的、以工农联盟为基础的、
人民民主专政的社会主义国家。”所体现的阶级等级和专政思想与“人权天赋、
约法共和、自主选择、平等竞争”的政治文明常识相违背,呼吁人大将其改为
“中国是全体公民组成的,致力于保障公民基本权利,为公民的生存与发展提供
良好公共环境的法治国家。中国全体公民的基本权利一律平等。”

                       在Cygwin上建立GTK+开发环境
                         丁建华 <[email protected]> 2004.7.20

    GTK+ 是个好东西, 在 linux 上做开发的没有不知道的. 我要讲的是 GTK+ for
Win32, 用 Cygwin 来做开发.

===================================================================
??? 从哪里下载 GTK+ for Win32 的运行文件?
>>> GTK+ 的官方网站是: http://www.gtk.org/ .
GTK+ for Win32 的官方网站是: http://www.gimp.org/~tml/gimp/win32/
可以下载 Gimp 和 GTK+ 的运行文件.

===================================================================
??? 我怎么知道 GTK+ 的这些 dll 文件真的能用呢?
>>> 安装 Gimp, 如果能用, 那么 GTK+ 一定是能用的. 注意你的 PATH 必须包含
GTK+ 的 dll 目录. 一般是 <installdir>/GTK/2.0/bin .

===================================================================
??? 从哪里下载 GTK+ for Win32 的开发文件?
>>> http://www.gimp.org/~tml/gimp/win32/downloads.html

===================================================================
??? 对下载的 zip 文件应该如何处理?
>>> 把这些 zip 文件解压到 /usr 目录下. 由于 Cygwin 对 /usr/bin 和 /usr/lib
是特殊对待的, 对这两个目录的访问实际上被转到了 /bin 和 /lib 目录下. 因此,
应该在解压后, 把 /usr/bin 和 /usr/lib 目录的内容分别转移到 /bin 和 /lib.

===================================================================
??? 为什么 pkg-config 给出的结果不正确?
>>> 在解压后的 lib/pkg-config/glib-2.0.pc 和其他 pc 文件中, 通常第一行都是:
<code> prefix=/target </code> 需要修改成 <code> prefix=/usr </code>.
可能还有些零星的修改. 都是一目了然的事情, 不再多说.

===================================================================
??? GTK+ 好像包含很多小的软件包, 我怎么知道哪些是必要的, 以及是否充分?
>>> 以下软件包应该是必要的:
<file-list>
atk.pc
gdk-2.0.pc
gdk-pixbuf-2.0.pc
gdk-win32-2.0.pc
glib-2.0.pc
gmodule-2.0.pc
gobject-2.0.pc
gthread-2.0.pc
gtk+-2.0.pc
gtk+-win32-2.0.pc
pango.pc
pangoft2.pc
pangowin32.pc
</file-list>
至于是否充分, 那要看具体项目的要求.

===================================================================
??? GTK+ 的文档对 autoconf/automake 说的很多. 请问一个典型的流程是什么样的?
>>> 建如下几个文件:
<file-set base="~/workspace">

<file "configure.ac">
AC_INIT(src/main.c)
AM_INIT_AUTOMAKE(gtkhello, 0.0.1)
AM_CONFIG_HEADER(config.h)
AM_MAINTAINER_MODE

AC_SUBST(VERSION)
AC_PROG_CC

AC_OUTPUT(Makefile src/Makefile)
</file>

<file "Makefile.am">
SUBDIRS = src
</file>

<file "src/main.c">
#include <config.h>

#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
    GtkWidget *window;

    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Hello, GTK+");
    g_signal_connect(G_OBJECT(window), "destroy",
             G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show(window);
    gtk_main();
    return 0;
}
</file>

<file "src/Makefile.am">
gtk_cflags = `pkg-config --cflags gtk+-2.0`
gtk_libs = `pkg-config --libs gtk+-2.0`
win32_flags = -mno-cygwin -mms-bitfields

bin_PROGRAMS = hello
hello_SOURCES = main.c
hello_CFLAGS = -Wall $(gtk_cflags) $(win32_flags)
hello_DEPENDENCIES =
hello_LDADD = $(gtk_libs) $(win32_flags)
</file>

</file-set>

然后执行如下命令:

<cmd>
cd ~/workspace
aclocal
autoheader
touch NEWS README AUTHORS ChangeLog
automake --add-missing --copy
autoconf
/configure
make
</cmd>

如果这个程序能够正常运行, 那你的开发环境就基本配置好了.

===================================================================
??? GTK+ 的应用项目一般都比较庞大, 可能需要做成 shared/dll 库. 请问一个
典型的 shared/dll 库的开发流程和配置是什么样的?
>>> 建立下面这些文件:
<file-set base="~/workspace">

<file "configure.ac">
AC_INIT(src/main.c)
AM_INIT_AUTOMAKE(dll-1st, 0.0.1)
AM_CONFIG_HEADER(config.h)
AM_MAINTAINER_MODE

AC_SUBST(VERSION)
AC_PROG_CC
AM_PROG_CC_STDC
AC_LIBTOOL_WIN32_DLL
AM_PROG_LIBTOOL
AC_C_CONST

AC_OUTPUT(Makefile src/Makefile)
</file>

<file "Makefile.am">
SUBDIRS = src
</file>

<file "src/hello.h">
extern int hello(const char *who);
</file>

<file "src/hello.c">
#include <stdio.h>
#include "hello.h"

int hello(const char *who)
{
    printf("Hello, %s!\n", who);
    return 0;
}
</file>

<file "src/main.c">
#include "hello.h"

int main()
{
    return hello("World");
}
</file>

<file "src/Makefile.am">
lib_LTLIBRARIES = libhello.la
libhello_la_SOURCES = hello.c
libhello_la_LDFLAGS = -no-undefined -version-info=0:0:0

include_HEADERS = hello.h

bin_PROGRAMS = hello
hello_SOURCES = main.c
hello_LDADD = libhello.la
</file>

</file-set>

然后用命令:

<cmd>
cd ~/workspace
aclocal
autoheader
libtoolize --copy
touch NEWS README AUTHORS ChangeLog
automake --add-missing --copy
autoconf
/configure
make
</cmd>

这个例子没有涉及 GTK+, 但是也足够说明问题. 如果要考虑 GTK+ 的话, 只需要
在 Makefile.am 当中加一些 CFLAGS, LIBS 或 LDADD 而已.

===================================================================
??? 一个项目涉及的 dll 多了, 相互关系就比较难以掌握, 请问有什么办法可以
了解 dll 之间的调用关系吗?
>>> <cmd> cygcheck prog.exe </cmd>
这个命令对 dll 也可以用.

===================================================================
??? 有一些供开发者参考的文档, 能否包括在软件包中发布, 但是并不安装?
>>> 在 Makefile.am 中使用:
<code>
dist_noinst_DATA = document.file
</code>

    就讲这么多了. 本人水平有限, 错漏之处在所难免, 欢迎拍砖.

<the-end/>

--
            支持公民自主,反对为民作主,更反对代民作主。
            支持公民平等,反对城市特权,更反对党派特权。
            支持守法治国,反对以法治国,更反对以德治国。
            支持法权独立,反对行政干预,更反对军权干预。
呼吁人大废除宪法第一条部分人高于其他人的歧视条款,尽快建立独立于行政的
司法体系,实现人人平等、依法共和的现代公民社会。    请一起采用本签名档。
※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 61.52.247.254]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 21:12 , Processed in 0.056980 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表