文章目录
- 写在前面
- MSYS2的安装/配置
- 添加环境变量
- 更换国内镜像
- 安装必需软件包
- Code::Blocks配置
- 一个简单的例子(hello world)
- 主要参考
写在前面
最近腾出时间来学习一下Gtkmm(一称Gtk–)这一经典的跨平台GUI集成软件,也当做C++的一个复习和应用。
既然是跨平台,当然就要在主流平台中进行环境的配置,在Mac OS上配置相对简单,直接使用brew包管理器进行安装即可,就是在CLion中写CMakeLists文件花了点时间研究(之前的文章有所提及,在此不赘述),其实主要还是pkg-config的应用。但是在Windows中进行配置就没有那么容易了,不仅需要msys2的类Linux环境, 还需要学习一下Code::Blocks这一经典的C++开发IDE(我咋Windows上开发使用surface go,性能和磁盘空间都不是太优,只能选择轻量级的IDE)。
开发环境:
Windows11(dev预览版)
MSYS2+Code::Blocks
MSYS2的安装/配置
之前我也想过在wsl中进行开发,但是后来为什么选择msys2呢?是因为gtkmm的安装配置文档1中明确指出了虽然在Windows下可用,但是最好还是用MSYS2环境,MSYS2环境其实就是模拟了一个Linux的环境,采用pacman
作为包管理,C/C++编译器使用mingw的gcc,具体的安装以及配置如下。
进入中科大镜像站(mirrors.ustc.edu.cn),搜索msys2,从这里下载msys2的话速度会快很多,下载64bit的最新版安装包即可。
安装的话比较简单,一路下一步就好,就是随后需要添加环境变量以及换国内镜像,然后安装所需的软件包。下面分别介绍。
添加环境变量
将如下路径添加到系统的环境变量中(Path变量):
-
C:\msys64\mingw64\bin\
; -
C:\msys64\usr\bin\
;
更换国内镜像
这里参考了中科大镜像的帮助界面2,不过我发现换不换源速度区别不是很大。
在这之前需要使用一个编辑器,我下载了vim,用来更改下面的镜像站点配置文件,安装命令如下:
pacman -S vim
之后进行文件的更改:
编辑 /etc/pacman.d/mirrorlist.mingw32
,在文件开头添加:
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686
编辑 /etc/pacman.d/mirrorlist.mingw64
,在文件开头添加
Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64
编辑 /etc/pacman.d/mirrorlist.msys
,在文件开头添加
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch
编辑 /etc/pacman.d/mirrorlist.ucrt64
,在文件开头添加
Server = http://mirrors.ustc.edu.cn/msys2/mingw/ucrt64
然后执行 pacman -Sy
刷新软件包数据即可。
安装必需软件包
这里首先需要安装gcc,
pacman -S mingw-w64-x86_64-gcc
然后安装gtkmm-4.0
pacman -S mingw-w64-x86_64-gtkmm4
pkg-config:
pacman -S pkg-config
可选的软件包:
glade(相当于qt-designer,是一个可视化的gui开发界面)
pacman -S mingw-w64-x86_64-glade
完成上述配置之后,还需要添加msys2的环境变量,因为这里的msys2相当于一个简易版的Linux环境,所以直接添加下面两行到.bashrc
文件(第二行可能需要):
export PATH="/c/msys64/mingw64/bin/:$PATH"
export PKG_CONFIG_PATH="/mingw64/lib/pkgconfig:/mingw64/share/pkgconfig:$PKG_CONFIG_PATH"
完成上面的安装以及配置后,应该就可以编译文件了,一般的编译命令是:
g++ main.cc test.h test.cc -o main -std=c++17 `pkg-config gtkmm-4.0 --cflags --libs`
如果你能用上面的命令成功编译一个gtkmm程序,那说明你的环境已经配置好了。
下面看看如何把上面的命令放在Code::Blocks中。
Code::Blocks配置
完成上述的操作后,就可以开始配置IDE了,虽然C::B是开源的跨平台编辑器,但是我还是觉得其自动补全等功能不太好用😂, 将就着使使了,还是CLion舒服。
进入settings
->compiler...
,可以看到如下界面
① 首先是C++标准,这里选择C++ 17 ISO C++
即可。
② 这里需要填写编译选项参数,这里需要注意的是,在windows自带的命令行工具cmd/powershell中,并不能正确使用pkg-config
命令,所以只能在msys2命令行下使用pkg-config gtkmm-4.0 --cflags
查看,这里我为了方便直接贴出来了,将下面的内容复制到②的框框里面即可。
-IC:/msys64/mingw64/include/gtkmm-4.0 -IC:/msys64/mingw64/lib/gtkmm-4.0/include -IC:/msys64/mingw64/include/giomm-2.68 -IC:/msys64/mingw64/lib/giomm-2.68/include -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include -mms-bitfields -IC:/msys64/mingw64/include/glibmm-2.68 -IC:/msys64/mingw64/lib/glibmm-2.68/include -IC:/msys64/mingw64/include/sigc++-3.0 -IC:/msys64/mingw64/lib/sigc++-3.0/include -IC:/msys64/mingw64/include/gtk-4.0 -IC:/msys64/mingw64/include/pango-1.0 -IC:/msys64/mingw64/include/harfbuzz -IC:/msys64/mingw64/include/freetype2 -IC:/msys64/mingw64/include/libpng16 -mms-bitfields -IC:/msys64/mingw64/include/fribidi -IC:/msys64/mingw64/include/cairo -IC:/msys64/mingw64/include/lzo -IC:/msys64/mingw64/include/pixman-1 -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -IC:/msys64/mingw64/include/gdk-pixbuf-2.0 -mms-bitfields -mms-bitfields -IC:/msys64/mingw64/include/graphene-1.0 -IC:/msys64/mingw64/lib/graphene-1.0/include -mfpmath=sse -msse -msse2 -mms-bitfields -IC:/msys64/mingw64/include/cairomm-1.16 -IC:/msys64/mingw64/lib/cairomm-1.16/include -IC:/msys64/mingw64/include/pangomm-2.48 -IC:/msys64/mingw64/lib/pangomm-2.48/include -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -pthread -mms-bitfields
③ 同理,这里是链接器选项,使用命令pkg-config gtkmm-4.0 --libs
查看,然后复制进③,内容如下:
-LC:/msys64/mingw64/lib -lgtkmm-4.0 -lgtk-4 -lpangowin32-1.0 -lcairo-gobject -lvulkan -lgraphene-1.0 -lpangomm-2.48 -lgiomm-2.68 -lgio-2.0 -lglibmm-2.68 -lcairomm-1.16 -lsigc-3.0 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lcairo -lgdk_pixbuf-2.0 -lgobject-2.0 -lglib-2.0 -lintl
最后就可以新建项目了,然后使用Ctrl+F9编译,F9编译并运行,就可以愉快写程序了。
一个简单的例子(hello world)
采用官方文档3中的hello world的例子,可以 编写如下程序
hw.h
:
#ifndef
#define
#include <gtkmm/button.h>
#include <gtkmm/window.h>
class HelloWorld : public Gtk::Window
{
public:
HelloWorld();
~HelloWorld() override;
protected:
//Signal handlers:
void on_button_clicked();
//Member widgets:
Gtk::Button m_button;
};
#endif// GTKMM_EXAMPLE_HELLOWORLD_H
hw.cc
:
#include "hw.h"
#include <iostream>
HelloWorld::HelloWorld()
: m_button("Hello World~") // creates a new button with label "Hello World".
{
// Sets the margin around the button.
m_button.set_margin(10);
// When the button receives the "clicked" signal, it will call the
// on_button_clicked() method defined below.
m_button.signal_clicked().connect(sigc::mem_fun(*this,
&HelloWorld::on_button_clicked));
// This packs the button into the Window (a container).
set_child(m_button);
}
HelloWorld::~HelloWorld()
{
}
void HelloWorld::on_button_clicked()
{
std::cout << "Hello World" << std::endl;
}
main.cc
:
#include "hw.h"
#include <gtkmm/application.h>
int main(int argc, char* argv[])
{
auto app = Gtk::Application::create("org.gtkmm.example");
//Shows the window and returns when it is closed.
return app->make_window_and_run<HelloWorld>(argc, argv);
}
运行结果如下:
注意 :这里如果需要取消程序运行时侯出现的命令行窗口,则需要在链接器选项中添加-mwindows
命令,但是一般在调试程序的时候有一个黑框框还是很有必要的。
主要参考
- gtkmm on Microsoft Windows; ↩︎
- MSYS2 源使用帮助 — USTC Mirror Help 文档; ↩︎
- gtkmm4 程序设计 (gnome.org); ↩︎