【发布时间】:2018-09-22 00:37:29
【问题描述】:
原始问题
我在安装 gtk 以开始在 Code::Blocks 上用 C++ 构建 GUI 时遇到问题。任何人都可以将我推向正确的方向吗?我在联想上运行 Windows 10(64 位)。
我尝试了安装指南 (https://www.youtube.com/watch?v=jvQXvTtSIQo)、堆栈溢出 (How do you install GTK+ 3.0 on Windows?)、官方 GTK 安装指南 (https://www.gtk.org/download/windows.php)、书面指南 (http://www.tarnyko.net/repo/gtk3_build_system/tutorial/gtk3_tutorial.htm),并且刚刚注意到一个非常相似的堆栈溢出(Install GTK for c on Windows 10?)
在此之前,我的PATH环境变量只记录了C:\Users\Owner\AppData\Local\Microsoft\WindowsApps;C:\Users\Owner\AppData\Roaming\npm;C:\Users\Owner\AppData\Local \atom\bin;%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
我从 mingw.org 下载了 MinGW。这是对 youtube 链接的评论,官方比可以使用 Code::Blocks 安装的更稳定。我将 C:\MinGW\bin 添加到 PATH。
尝试了官方的GTK安装站点,我下载了MSYS2并使用pacman -Syu安装核心系统包,然后使用pacman -Su进行更新。到此结束,所以我认为 gtk 已经正式安装,我只需要让它与 Code::Blocks 对话。我将 C:\msys64\mingw64\bin 添加到 PATH ,但这似乎不起作用。
我尝试在 http://www.tarnyko.net/dl/gtk.htm 上安装 GTK 3.6.4 的一体化软件包,并将其解压缩到 C:\gtk。我现在在 PATH 中有 C:\gtk\bin。 GTK 应该以一种或另一种形式出现在我的道路上。我可以从 CMD 运行 gtk3-demo 和 gtk-demo-application,但不能从 MSYS2 运行。我对此有点困惑。我认为这可能与 MSYS2 的特定路径变量有关?但它应该在之后搜索系统的 PATH 吗?而且我不知道如何更改该特定路径?可能是另一天的问题。
所以类似的堆栈溢出、youtube 和书面教程都说要使用pkg-config --cflags --libs gtk+-3.0 检查合理的输出以查看我是否正确安装了 gtk。我安装了
pkg-config-lite 以避免How to install pkg config in windows? 描述的 glib 循环依赖问题,坦率地说我不明白。我将它添加到 C:\MinGW\bin 到我的路径中。现在我可以运行它了,但是得到:
Package gtk+-3.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtk+-3.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gtk+-3.0' found
我尝试了 3.6.4 而不是 3.0。没有骰子。我只试了3个。不。我只能找到 gtk3 文件,而不是我在任何地方安装的实际版本。 pkg-config --cflags --libs 说我需要命名一个库,所以我尝试了 gtk hopiing 来获取包含它的库。没有。其余教程旨在让 Code::Blocks 编译器(我认为)包含 gtk。我希望这是唯一的障碍,其余的我都能解决。但是,如果有人可以帮助我完成其余的工作,将不胜感激。
在这一点上,我没有想法。有人可以帮我吗?
非常感谢, 约翰
Liberforce 回答后的更多问题
感谢您撰写https://www.gtk.org/download/windows.php !我敢打赌,它可以帮助很多像我这样沮丧的新手。一切正常后,我会提供更适当的反馈。如果您能提供更多帮助,我一直在编译 C/C++ 程序。在我开始之前,我想非常清楚我采取的确切步骤。步骤名称与您的书面说明相对应。
第 1 步:安装 MSYS2
好的,正在重置所有内容...
从 PATH 和计算机中删除了 C:/gtk 目录,也就是所有 tarnyko 文件。
从 PATH 和计算机中删除 C:/MinGW 目录,有效卸载。我阅读了您与 Simon(Unable to compile code with GTK 和 https://chat.stackoverflow.com/rooms/156828/discussion-between-liberforce-and-simon)关于 MinGW 终端(包括 msys1.0)和 MSYS2 终端(包括 MinGW)之间的混淆的对话。我想这会更安全。
因此,我在 PATH 中只有 C:\msys64(以及我之前拥有的,与 GTK 无关)。
卸载 MSYS2(通过添加/删除程序)并使用来自 www.msys2.org 的 x86_64 重新安装。在 pacman -Syu 上,我收到错误,“msys2-runtime 和 catgets 发生冲突”和“msys2-runtime 和 libcatgets 发生冲突”。输入 y 删除两者。
我一直在卸载并重新安装,但遇到了以下问题... (5/5) 升级 pacman 达到 100% 并弹出警告: 警告:终止 MSYS2 而不返回 shell 并再次检查更新 警告:例如关闭终端窗口而不是调用 exit
程序在这里停止。我认为这意味着关闭窗口。我做到了,然后单击“确定”对话框“进程正在会话中运行:仍然关闭?”。窗口现在打印“收到挂断信号”并且不再响应。我使用任务管理器来杀死它。
在第一个 pacman -Syu 之后通过桌面应用程序打开 MSYS2 给了我选择哪个 shell 的对话框:MSYS2、Mingw-w64 32 位、Mingw-w64 64 位。我改为进入文件系统并为所有未来实例打开 C:\msys64\msys2_shell.cmd。
运行 pacman -Syu 来完成安装包。我再次重新启动 MSYS2,然后运行 pacman -Su 显示
:: Starting core system upgrade...
there is nothing to do
:: Starting full system upgrade...
there is nothing to do
pacman -Syuu 显示:
:: Synchronizing package databases...
mingw32 is up to date
mingw64 is up to date
msys is up to date
pacman -Su、pacman -Sy 和 pacman -Suu 同样显示一切正常。关闭并重新打开 C:\msys64\msys2_shell.cmd
pkg-cofig 只是给出“bash: pkg-config: command not found”。所以我运行了 pacman -S pkg-config 并让它工作。但是,无法找到https://github.com/msys2/msys2/wiki/MSYS2-installation 中提到的更新核心,并且 pacman -S update-core 将不起作用。 pacman -Ss core 出现:
msys/coreutils 8.26-2 (base) [installed]
The basic file, shell and text manipulation utilities of the GNU operating
system
还有其他看似无关的文件。 pacman -Ss core 的结果也似乎无关紧要。
pacman --version 显示:
.--. Pacman v5.0.1 - libalpm v10.0.1
/ _.-' .-. .-. .-. Copyright (C) 2006-2016 Pacman Development Team
\ '-. '-' '-' '-' Copyright (C) 2002-2006 Judd Vinet
'--'
This program may be freely redistributed under
the terms of the GNU General Public License.
运行“pacman --needed -S bash pacman pacman-mirrors msys2-runtime”来显示:
warning: bash-4.4.019-2 is up to date -- skipping
warning: pacman-5.0.1-5 is up to date -- skipping
warning: pacman-mirrors-20160112-1 is up to date -- skipping
warning: msys2-runtime-2.10.0-2 is up to date -- skipping
there is nothing to do
我退出了所有 msys shell,并运行了 C:\msys64\autorebase.bat,虽然不是在 32 位系统上。我相信当它说要重新打开 msys2_shell.bat 时有一个错字,我没有。我打开了 msys2_shell.cmd。我再次使用 pacman -Suu 表明一切正常。
第 2 步 -> 第 5 步(可选):安装构建工具
打开 C:\msys64\msys2_shell.cmd 并运行“pacman -S mingw-w64-x86_64-gtk3”(GTK+3 包)和“pacman -S mingw-w64-x86_64-toolchain base-devel”(包开发其他语言的 GTK+3 应用程序)(提示时默认为所有安装)。
无法编译 GTK+3 应用程序
重新启动计算机。打开 C:\msys64\msys2_shell.cmd。关注https://developer.gnome.org/gtk3/stable/gtk-getting-started.html。
将简单的窗口教程文件放在 C:\Users\Owner\Desktop\test_code\example-0.c 中。运行 gcc pkg-config --cflags gtk+-3.0 -o example-0 example-0.c pkg-config --libs gtk+-3.0 时,在我原来的问题中出现错误。使用“pacman -Ss gtk3”查看我认为需要的两个包。跑“pacman -S mingw-w64-x86_64-gtk3 mingw-w64-x86_64-gtkmm3”。
要在 Unable to compile code with GTK 上回答您对 Simon 关于同样错误的问题,pkg-config --list-all | grep gtk 不会返回任何内容,即使在关闭并重新打开 C:\msys64\msys2_shell.cmd 之后也是如此。 “哪个 gcc”返回:
其中:没有 gcc 在(/usr/local/bin:/usr/bin:/bin:/opt/bin:/c/Windows/System32: /c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/: /usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl)
我在 C:\msys64\mingw64\include 下看到 gtk-3.0。我不知道如何将它添加到路径中。 "echo $PKG_CONFIG_PATH" 返回:
/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig
使用 GTK+3 正确编译控制台中的文件
检查 GTK 是否在控制台中
我需要在 Mingw-w64 64 位 shell 中打开 MSYS2。这可以通过 MSYS2 的桌面应用程序执行,它会提示您要打开三个 shell 中的哪一个:MSYS2、Mingw32 和 Mingw64。具体来说,我使用命令mingw-w64-x86_64-toolchain 安装gtk 意味着它只能通过这种方式访问。
这个 shell 中的命令表明我确实有 gtk:
$ pkg-config --modversion gtk+-3.0 --> 3.22.29
$ which gcc --> /mingw64/bin/gcc
从 Mingw64 控制台编译的示例代码
我参考了https://github.com/msys2/msys2/wiki/MSYS2-introduction 来学习文件系统/驱动器安装语法。我将从https://developer.gnome.org/gtk3/stable/gtk-getting-started.html 获得的示例代码放在`/c/Users/Owner/Desktop/test_code/example-0.c' 中。我只是使用了我最喜欢的 IDE,Atom,但任何文本编辑器都可以。
打开 MSYS2 的 Mingw64 shell,cd /c/Users/Owner/Desktop/test_code/,用 gcc \pkg-config --cflags gtk+-3.0` -o example-0 example-0.c `pkg-config --libs gtk+-3.0` 编译, 并使用./example-0 执行
链接 GTK+3 和 Code::Blocks 编译器失败
我了解一些链接器设置
我进入了 Code::Blocks。转到 Settings > Compiler... 确保使用 Selected compiler 下的下拉框来选择 GNU GCC Compiler,并在我第一次安装 Code::Blocks 时由于复杂性而单击了 Reset Defaults。编译器标志下的复选框在重置后应该全部为空白,因此我在常规和“启用所有常见的编译器警告(覆盖许多其他设置)[-Wall]”在警告下。
在编译器标志旁边,我转到链接器设置并将文本添加到其他链接器选项。我通过运行pkg-config --cflags gtk+-3.0 得到了这个文本:
-mms-bitfields -pthread -mms-bitfields -IC:/msys64/mingw64/include/gtk-3.0 -IC:/msys64/mingw64/include/cairo -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/pango-1.0 -IC:/msys64/mingw64/include/fribidi -IC:/msys64/mingw64/include/atk-1.0 -IC:/msys64/mingw64/include/cairo -IC:/msys64/mingw64/include/pixman-1 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/freetype2 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/harfbuzz -IC:/msys64/mingw64/include/libpng16 -IC:/msys64/mingw64/include/gdk-pixbuf-2.0 -IC:/msys64/mingw64/include/libpng16 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include -IC:/msys64/mingw64/include -LC:/msys64/mingw64/lib -lgtk-3 -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lz -lpangowin32-1.0 -lpangocairo-1.0 -lpango-1.0 -lfribidi -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl
说明:从控制台编译时,我使用了包含文本 /pkg-config --cflags gtk+-3.0`` 的命令。反引号表示在高级编译命令之前运行pkg-config --cflags gtk+-3.0,并将出现的任何文本插入高级编译命令。 Code::Blocks 需要链接器设置下的该文本。
我不了解搜索目录
在“设置”>“编译器...”中,在“编译器设置”旁边,我单击了“搜索目录”。我知道你需要在这里做一些工作。在此之后,您返回链接器设置完成,您的 Code::Blocks 将准备就绪!
如果有人可以在这里帮助我,或者如果我弄清楚了,我很乐意完成,以防这有助于后代。我有 GTK 编译,现在已经足够了。
【问题讨论】:
标签: gtk codeblocks msys2