为 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 机器上编译可执行文件要容易得多。
- 下载并安装 MSYS2。
- 安装完成后,更新MSYS2:
pacman -Syu
- 安装
gcc
& mingw
软件包:
- 对于 i686 机器:
pacman -S mingw-w64-i686-gcc
- 对于 x86_64 机器:
pacman -S mingw-w64-x86_64-gcc
- 安装
gtkmm
库:
- 对于 i686 机器:
pacman -S mingw-w64-i686-gtkmm3
- 对于 x86_64 台机器:
pacman -S mingw-w64-x86_64-gtkmm3
- 安装
pkg-config
:
pacman -S pkg-config
- 现在在
C:/msys64
中打开mingw64.exe
并导航到源代码所在的目录。
最后的鱼子酱,编译你的源代码使用:
g++ -std=c++11 hello.cpp -o myApp $(pkg-config gtkmm-3.0 --cflags --libs | sed 's/ -I/ -isystem /g')
我正在使用 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 机器上编译可执行文件要容易得多。
- 下载并安装 MSYS2。
- 安装完成后,更新MSYS2:
pacman -Syu
- 安装
gcc
&mingw
软件包:
- 对于 i686 机器:
pacman -S mingw-w64-i686-gcc
- 对于 x86_64 机器:
pacman -S mingw-w64-x86_64-gcc
- 对于 i686 机器:
- 安装
gtkmm
库:
- 对于 i686 机器:
pacman -S mingw-w64-i686-gtkmm3
- 对于 x86_64 台机器:
pacman -S mingw-w64-x86_64-gtkmm3
- 对于 i686 机器:
- 安装
pkg-config
:
pacman -S pkg-config
- 现在在
C:/msys64
中打开mingw64.exe
并导航到源代码所在的目录。
最后的鱼子酱,编译你的源代码使用:
g++ -std=c++11 hello.cpp -o myApp $(pkg-config gtkmm-3.0 --cflags --libs | sed 's/ -I/ -isystem /g')