为 Windows 编译 C++ GUI(在 macOS 上)

Compiling C++ GUI for Windows (on macOS)

我正在使用 macOS Catalina (v10.15.7) 从 gtkmm 的 online book:

编译以下示例代码
#include <gtkmm.h>

int main(int argc, char *argv[])
{
    auto app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.base");
    Gtk::Window window;
    window.set_default_size(200, 200);
    return app->run(window);
}

它在 macOS 上编译得很好,但如果我尝试为 Windows 编译它,使用:

x86_64-w64-mingw32-g++ -o app.exe main.cpp -std=c++11 `pkg-config gtkmm-3.0 --cflags --libs`

除了各种警告,我还收到以下错误,我在 Google 和 Stack Overflow 上几乎找不到任何解决方案:

/usr/local/Cellar/glib/2.66.2_1/include/glib-2.0/gio/gcredentials.h:75:1: error: 'uid_t' does not name a type; did you mean 'pid_t'?
   75 | uid_t            g_credentials_get_unix_user      (GCredentials    *credentials,
      | ^~~~~
      | pid_t
/usr/local/Cellar/glib/2.66.2_1/include/glib-2.0/gio/gcredentials.h:79:52: error: 'uid_t' has not been declared
   79 |                                                    uid_t           uid,
      |                                                    ^~~~~
/usr/local/Cellar/glibmm/2.64.5/include/giomm-2.4/giomm/credentials.h:243:3: error: 'uid_t' does not name a type; did you mean 'pid_t'?
  243 |   uid_t get_unix_user();
      |   ^~~~~
      |   pid_t
/usr/local/Cellar/glibmm/2.64.5/include/giomm-2.4/giomm/credentials.h:264:22: error: 'uid_t' has not been declared
  264 |   bool set_unix_user(uid_t uid);
      |                      ^~~~~

非常感谢任何帮助。

element chat room 那里得知,macOS 上的 pkg-config 似乎正在使用其库的 macOS 版本进行编译。即使 uid_t 等编译时错误得到解决,库也无法正确 link。

最后,直接在 Windows 机器上编译可执行文件要容易得多。

  1. 下载并安装 MSYS2
  2. 安装完成后,更新MSYS2:
    pacman -Syu
  3. 安装 gcc & mingw 软件包:
    • 对于 i686 机器:
      pacman -S mingw-w64-i686-gcc
    • 对于 x86_64 机器:
      pacman -S mingw-w64-x86_64-gcc
  4. 安装 gtkmm 库:
    • 对于 i686 机器:
      pacman -S mingw-w64-i686-gtkmm3
    • 对于 x86_64 台机器:
      pacman -S mingw-w64-x86_64-gtkmm3
  5. 安装pkg-config:
    pacman -S pkg-config
  6. 现在在C:/msys64中打开mingw64.exe并导航到源代码所在的目录。

最后的鱼子酱,编译你的源代码使用:

g++ -std=c++11 hello.cpp -o myApp $(pkg-config gtkmm-3.0 --cflags --libs | sed 's/ -I/ -isystem /g')