QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1726|回复: 10

Windows下使用GTK+2的两个问题

[复制链接]
发表于 2005-9-4 15:38:27 | 显示全部楼层 |阅读模式
GTK+2 写的程序在Linux下能正常行,gcc 编译的参数是
-Wall -g `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
到 Windows 里用gcc编译多加了 -mms-bitfields 参数。
现有以下两个疑问:

1. 在 Windows 下运行时会先启动一个终端,这个终端要到程序退出的时候才会退出。
有没有办法能把那个终端去掉,象普通的Windows程序一样启动?

2. 在 Windows 下运行时窗口管理器上的会出现一个GTK+的图标。
我想知道这个图标是怎么来的?怎样改成其他图标?
发表于 2005-9-4 16:16:53 | 显示全部楼层
怎么会多带个终端,应该不带吧,你用glade生成的代码试试,记得window下专门有API可以启动和关闭终端
回复

使用道具 举报

发表于 2005-9-4 18:19:57 | 显示全部楼层
1.关于第一个问题.你可以用一个16bit文件编辑器打开编译好的文件,找到PE头,找到偏移subsystem的位置,该位置占据2byte,(0001表示系统文件,0002表示没终端的gui程序,0003表示有终端的程序,0004表示POSIX gui程序)
你只要改成0002就不会出现终端了

2.也是修改PE文件格式

以上操作都可以借助一个叫EXESCOPE的工具来弄
回复

使用道具 举报

发表于 2005-9-5 10:22:40 | 显示全部楼层

第一问题,是你的PROJECT是选择终端程序,还是图形程序做成的!
第二问题,你可以自己在程序中更改图标的!
回复

使用道具 举报

 楼主| 发表于 2005-9-6 09:29:44 | 显示全部楼层
谢谢楼上几位的解答。


[quote:9e7f6b31e0="Kan"]
第一问题,是你的PROJECT是选择终端程序,还是图形程序做成的!
[/quote]
我没有用IDE工具创建工程。我的代码和Makefile都是自已写的。以一个最简单的程序为例:

程序test.c代码如下:
[code:1]
#include <gtk/gtk.h>

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

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  g_signal_connect (G_OBJECT (window), "destroy",
                    G_CALLBACK (gtk_main_quit),
                    NULL);
  gtk_window_set_title (GTK_WINDOW (window), "Test Program");

  /* 此处省略部分代码 */

  gtk_widget_show (window);

  gtk_main ();

  return 0;
}

[/code:1]


一个简单的Makefile如下:
[code:1]
CC=gcc
PROGRAM_NAME=test
SOURCES=$(wildcard *.c)
CFLAGS=-Wall -g
WIN32_FLAGS=-mms-bitfields
CYGWIN_FLAGS=-mno-cygwin
GLIB_CFLAGS=`pkg-config --cflags gtk+-2.0`
GLIB_LIBS= `pkg-config --libs gtk+-2.0`
FOOBAR_OBJS=$(SOURCES)

$(PROGRAM_NAME).exe : $(FOOBAR_OBJS)
           $(CC) $(CFLAGS) -o $@ $(FOOBAR_OBJS) $(WIN32_FLAGS) $(GLIB_CFLAGS) $(GLIB_LIBS)
[/code:1]


(-mms-bitfields 参数仅在Win32下用, Linux 下不用)
对于这个程序来说,这段Makefile相当于下面这行:
gcc -mms-bitfields -Wall -g test.c -o test `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`

结果在Linux下编译后运行正常,而Windows下编译后运行时就会出现上面所说的终端框。
(Window下在Mingw和Cygwin里编译都是如此,其中Cygwin里编译时加了参数 -mno-cygwin )




[quote:9e7f6b31e0="Kan"]
第二问题,你可以自己在程序中更改图标的![/quote]
更改图标的问题可能上面我没讲清楚。

在GTK程序未设图标时,Linux的窗口管理器上不会出现图标,而Windows的窗口管理器右上角会有一个默认的GTK图标。
我的意思是:对所有未设图标的GTK程序,能否在Windows的窗口管理器上出现的图标都改用我自己定义的图标,而不是现在默认的那个。
回复

使用道具 举报

发表于 2005-9-6 09:35:11 | 显示全部楼层
# Project: navsys
# Makefile created by Dev-C++ 4.9.9.2

CPP  = g++.exe
CC   = gcc.exe
WINDRES = windres.exe
RES  = navsys_private.res
OBJ  = ../src/main.o ../src/callbacks.o ../src/interface.o ../src/support.o ../src/calculate.o ../src/storage.o ../src/listview.o ../src/points.o ../src/maps.o ../src/draw.o $(RES)
LINKOBJ  = ../src/main.o ../src/callbacks.o ../src/interface.o ../src/support.o ../src/calculate.o ../src/storage.o ../src/listview.o ../src/points.o ../src/maps.o ../src/draw.o $(RES)
LIBS =  -L"C:/GTK/LIB" -mwindows -L"$(GTK_BASEPATH)/lib" -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv  
INCS =  -I"C:/GTK/INCLUDE"  -I"C:/GTK/INCLUDE/GTK-2.0"  -I"C:/GTK/INCLUDE/GLIB-2.0"  -I"C:/GTK/INCLUDE/PANGO-1.0"  -I"C:/GTK/INCLUDE/ATK-1.0"  -I"C:/GTK/INCLUDE/GTKGLEXT-1.0"  -I"C:/GTK/LIB/GTK-2.0/INCLUDE"  -I"C:/GTK/LIB/GLIB-2.0/INCLUDE"  -I"C:/GTK/LIB/GTKGLEXT-1.0/INCLUDE"  -I"C:/GTK/INCLUDE/LIBGLADE-2.0"  -I"C:/GTK/INCLUDE/LIBXML2"  -I"."
CXXINCS =  -I"C:/GTK/INCLUDE"  -I"C:/GTK/INCLUDE/GTK-2.0"  -I"C:/GTK/INCLUDE/GLIB-2.0"  -I"C:/GTK/INCLUDE/PANGO-1.0"  -I"C:/GTK/INCLUDE/ATK-1.0"  -I"C:/GTK/INCLUDE/GTKGLEXT-1.0"  -I"C:/GTK/LIB/GTK-2.0/INCLUDE"  -I"C:/GTK/LIB/GLIB-2.0/INCLUDE"  -I"C:/GTK/LIB/GTKGLEXT-1.0/INCLUDE"  -I"C:/GTK/INCLUDE/LIBGLADE-2.0"  -I"C:/GTK/INCLUDE/LIBXML2"  -I"."
BIN  = navsys.exe
CXXFLAGS = $(CXXINCS) -mms-bitfields -mwindows -DHAVE_CONFIG_H -I"$(GTK_BASEPATH)/include/gtk-2.0" -I"$(GTK_BASEPATH)/lib/gtk-2.0/include" -I"$(GTK_BASEPATH)/include/atk-1.0" -I"$(GTK_BASEPATH)/include/pango-1.0" -I"$(GTK_BASEPATH)/include/glib-2.0" -I"$(GTK_BASEPATH)/lib/glib-2.0/include" -I"$(GTK_BASEPATH)/include" -DPACKAGE_PREFIX=\"\" -DPACKAGE_DATA_DIR=\"\" -DPACKAGE_LOCALE_DIR=\"\"  
CFLAGS = $(INCS) -mms-bitfields -mwindows -DHAVE_CONFIG_H -I"$(GTK_BASEPATH)/include/gtk-2.0" -I"$(GTK_BASEPATH)/lib/gtk-2.0/include" -I"$(GTK_BASEPATH)/include/atk-1.0" -I"$(GTK_BASEPATH)/include/pango-1.0" -I"$(GTK_BASEPATH)/include/glib-2.0" -I"$(GTK_BASEPATH)/lib/glib-2.0/include" -I"$(GTK_BASEPATH)/include" -DPACKAGE_PREFIX=\"\" -DPACKAGE_DATA_DIR=\"\" -DPACKAGE_LOCALE_DIR=\"\"  
RM = rm -f

.PHONY: all all-before all-after clean clean-custom

all: all-before navsys.exe all-after


clean: clean-custom
        ${RM} $(OBJ) $(BIN)

$(BIN): $(OBJ)
        $(CC) $(LINKOBJ) -o "navsys.exe" $(LIBS)

../src/main.o: ../src/main.c
        $(CC) -c ../src/main.c -o ../src/main.o $(CFLAGS)

../src/callbacks.o: ../src/callbacks.c
        $(CC) -c ../src/callbacks.c -o ../src/callbacks.o $(CFLAGS)

../src/interface.o: ../src/interface.c
        $(CC) -c ../src/interface.c -o ../src/interface.o $(CFLAGS)

../src/support.o: ../src/support.c
        $(CC) -c ../src/support.c -o ../src/support.o $(CFLAGS)

../src/calculate.o: ../src/calculate.c
        $(CC) -c ../src/calculate.c -o ../src/calculate.o $(CFLAGS)

../src/storage.o: ../src/storage.c
        $(CC) -c ../src/storage.c -o ../src/storage.o $(CFLAGS)

../src/listview.o: ../src/listview.c
        $(CC) -c ../src/listview.c -o ../src/listview.o $(CFLAGS)

../src/points.o: ../src/points.c
        $(CC) -c ../src/points.c -o ../src/points.o $(CFLAGS)

../src/maps.o: ../src/maps.c
        $(CC) -c ../src/maps.c -o ../src/maps.o $(CFLAGS)

../src/draw.o: ../src/draw.c
        $(CC) -c ../src/draw.c -o ../src/draw.o $(CFLAGS)

navsys_private.res: navsys_private.rc
        $(WINDRES) -i navsys_private.rc --input-format=rc -o navsys_private.res -O coff

DEV CPP生成的makefile,和你的对比一下吧,应该是这个 -mwindows的区别
回复

使用道具 举报

发表于 2005-9-6 13:08:30 | 显示全部楼层
DEV CPP生成的makefile,和你的对比一下吧,应该是这个 -mwindows的区别

是这样的,在用gcc/minGW开发win下的程序时要加-mwindows,不管是不是用GTK
回复

使用道具 举报

 楼主| 发表于 2005-9-6 14:30:29 | 显示全部楼层
在自已的Makefile里加上-mwindows这个参数后再用gcc编译,终端果然就去掉了。

新的问题又来了:
参数-mwindows在VC里是不起作用的,如果用VC编译仍然会有终端。有谁知道用VC编译如何解决呢?

VC的Makefie用的是该页里提供的:http://www.gimp.org/~tml/gimp/win32/downloads.html
內容如下:
[code:1]
foobar.exe: foobar.obj __gtk_libs.mak
        cl -MD foobar.obj @__gtk_libs.mak
        @del __gtk_libs.mak

foobar.obj: foobar.c __gtk_cflags.mak
        cl -MD -c @__gtk_cflags.mak foobar.c
        @del __gtk_cflags.mak

__gtk_cflags.mak:
        pkg-config --msvc-syntax --cflags gtk+-2.0 >$@

__gtk_libs.mak:
        for /F "delims==" %i in ('pkg-config --msvc-syntax --libs gtk+-2.0') \
                do echo /link %i >$@
[/code:1]
回复

使用道具 举报

发表于 2005-9-6 18:57:41 | 显示全部楼层
怎么都不听我的,去直去改编译以后出来的PE可执行文件,这种方法万能的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2005-9-6 22:06:46 | 显示全部楼层
怎么都不听我的,去直去改编译以后出来的PE可执行文件,这种方法万能的

呵呵,这个是可行,不过我们这是在讨论嘛
回复

使用道具 举报

 楼主| 发表于 2005-9-7 20:20:37 | 显示全部楼层
  用VC编译去掉终端也搞定了:

先加参数 /subsystem:windows

此时编译会出错,因为设成了窗口模式,默认的入口函数是WinMain,不是main.
所以还要加上参数 /entry:"mainCRTStartup 把入口函数改成 main .
这样就好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 11:27 , Processed in 0.063765 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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