GTK+是一个图形工具包,在OpenSIFT主要用它来实现窗口和画一些线。在The GTK+ Project这个网站上下载GTK+,我选择Windows(64-bit)版本,当前是Version3.6.4,点all-in-one bundle.下载下来是一个zip压缩包,里面有一个txt说明。把压缩包解压到一个空目录下,比如我放在E:\GTK\ 下,然后将bin的路径添加进系统环境变量PATH中。之后按说明验证,Win+R输入cmd运行,在cmd中输入“pkg-config --cflags gtk+-2.0” ,会有一些输出,输入 “gtk3-demo” ,会出现一个示例,演示GTK+的一些功能控件。
接下来要在VS2013的项目中进行一番配置了。
(详细流程参考:http://stackoverflow.com/questions/15906580/how-to-configure-gtk-on-visual-studio-2010)
其中需改进部分:
修改包含目录:$(VC_IncludePath);$(WindowsSDK_IncludePath);E:\GTK\lib\gtk-2.0\include;E:\GTK\include;
修改库目录:E:\GTK\lib;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);
(注意,我是64位所以是x64,如果是32位是x86)
在CMD中运行“pkg-config --cflags gtk+-3.0 > G:\gtk.txt”,打开G:\gtk.txt,内容如下:
-D_REENTRANT -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
去掉-D_REENTRANT
把usr/全部换成绝对路径
之后如下:
-IE:/GTK/include/gtk-3.0 -IE:/GTK/include/at-spi2-atk/2.0 -IE:/GTK/include/at-spi-2.0 -IE:/GTK/include/dbus-1.0 -IE:/GTK/lib/dbus-1.0/include -IE:/GTK/include/gtk-3.0 -IE:/GTK/include/gio-unix-2.0/ -IE:/GTK/include/cairo -IE:/GTK/include/pango-1.0 -IE:/GTK/include/harfbuzz -IE:/GTK/include/pango-1.0 -IE:/GTK/include/atk-1.0 -IE:/GTK/include/cairo -IE:/GTK/include/pixman-1 -IE:/GTK/include/freetype2 -IE:/GTK/include/libpng16 -IE:/GTK/include/freetype2 -IE:/GTK/include/libpng16 -IE:/GTK/include/gdk-pixbuf-2.0 -IE:/GTK/include/libpng16 -IE:/GTK/include/glib-2.0 -IE:/GTK/lib/glib-2.0/include
添加到 右击项目-》属性-》C/C++-》命令行-》其他选项
在CMD中运行“pkg-config --libs gtk+-3.0 > G:\gtk.txt”输出的是:
-lgtk-3 -latk-bridge-2.0 -latspi -ldbus-1 -lgdk-3 -lgio-2.0 -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lpangocairo-1.0 -lpangoft2-1.0 -lharfbuzz -lpango-1.0 -lm -latk-1.0 -lcairo-gobject -lcairo -lz -lGL -lpixman-1 -lfontconfig -lexpat -lfreetype -lbz2 -lz -lpng16 -lm -lz -lexpat -lfreetype -lbz2 -lz -lEGL -lm -lpthread -lGL -lm -lpthread -lXdamage -lXfixes -lX11-xcb -lxcb-glx -lpng16 -lm -lz -lxcb-shm -lxcb-render -lXrender -lXext -lX11 -lxcb -lXau -lXdmcp -lgdk_pixbuf-2.0 -lm -lpng16 -lm -lz -lgio-2.0 -lz -lgmodule-2.0 -lgobject-2.0 -lffi -lglib-2.0 -lintl -lpcre -lintl -liconv -lpcre
以上其实很有问题,根据http://stackoverflow.com/questions/20128380/error3error-lnk1104-cannot-open-file-gtk-3-lib
直接把所有lib加进去:
cmd中进入E:\GTK\lib
输入dir *.lib /B 得到所有lib
在最后加上/ENTRY:mainCRTStartup
内容如下:
atk-1.0.lib
cairo.lib
fontconfig.lib
gailutil.lib
gdk-win32-3.0.lib
gdk_pixbuf-2.0.lib
gio-2.0.lib
glib-2.0.lib
gmodule-2.0.lib
gobject-2.0.lib
gthread-2.0.lib
gtk-win32-3.0.lib
pango-1.0.lib
pangocairo-1.0.lib
pangoft2-1.0.lib
pangowin32-1.0.lib /ENTRY:mainCRTStartup
添加到右击项目-》属性-》链接器-》命令行-》其他选项
注意事项:保证一下配置:
子系统为windows:
若为64位的GTK:
出现错误:
1>test.obj : error LNK2019: 无法解析的外部符号 _g_type_check_instance_cast,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _g_signal_connect_data,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _gtk_widget_show,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _gtk_window_get_type,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _gtk_window_new,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _gtk_window_set_title,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _gtk_init_abi_check,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _gtk_main,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _gtk_main_quit,该符号在函数 _main 中被引用
解决方案:
设置平台为x64,若无x64平台,则新建-》选择x64-》复制win32 成功创建:
若出现错误:
1>x64\Debug\test.obj : fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突
解决方案:(参考http://blog.csdn.net/tfy1028/article/details/8660823)
保证目标计算机是x64,修改后注意重新生成解决方案再运行:
新建源文件test.cpp
#include
int main(int argc, char* argv[])
{
gtk_init(&argc, &argv);
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//gtk_widget_get_preferred_size(window, 300, 200);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_title(GTK_WINDOW(window), "GTK+ with VS2010");
gtk_widget_show(window);
gtk_main();
return 0;
}
运行测试,成功则ok