Gcc 从Linux for Windows编译Vala

Gcc 从Linux for Windows编译Vala,gcc,vala,mingw-w64,Gcc,Vala,Mingw W64,我通常只编写高级代码,所以我根本没有编译代码的经验(就像IDE通常为我做的那样),所以我可能忽略了一些非常明显的事情。 我花了很多时间研究如何在Linux中编译Vala,但我似乎无法做到这一点 以下是我采取的步骤: 我安装了valac、gtk、mingw64(我构建了一个docker映像以确保:0620731/valac:mingw64) 从展示gtk3的gnome教程中复制了一些可用的vala代码 运行以下命令:valac--cc=x86_64-w64-mingw32-gcc-win32--p

我通常只编写高级代码,所以我根本没有编译代码的经验(就像IDE通常为我做的那样),所以我可能忽略了一些非常明显的事情。 我花了很多时间研究如何在Linux中编译Vala,但我似乎无法做到这一点

以下是我采取的步骤:

  • 我安装了valac、gtk、mingw64(我构建了一个docker映像以确保:0620731/valac:mingw64)
  • 从展示gtk3的gnome教程中复制了一些可用的vala代码
  • 运行以下命令:valac--cc=x86_64-w64-mingw32-gcc-win32--pkg gtk+-3.0-X-mwindows../main.vala(我也尝试了不同的编译器。结果各不相同,但都不好。)
  • 我得到的结果是:

    In file included from /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h:9:0,
                     from /usr/include/glib-2.0/glib/gtypes.h:32,
                     from /usr/include/glib-2.0/glib/galloca.h:32,
                     from /usr/include/glib-2.0/glib.h:30,
                     from /home/developer/vala/Documents/Projects/gamedev/vala-test/bin/main.vala.c:6:
    /usr/include/glib-2.0/glib/gtypes.h: In function '_GLIB_CHECKED_ADD_U64':
    /usr/include/glib-2.0/glib/gmacros.h:241:53: error: size of array '_GStaticAssertCompileTimeAssertion_0' is negative
     #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
                                                         ^
    /usr/include/glib-2.0/glib/gmacros.h:238:47: note: in definition of macro 'G_PASTE_ARGS'
     #define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
                                                   ^~~~~~~~~~~
    /usr/include/glib-2.0/glib/gmacros.h:241:44: note: in expansion of macro 'G_PASTE'
     #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
                                                ^~~~~~~
    /usr/include/glib-2.0/glib/gtypes.h:423:3: note: in expansion of macro 'G_STATIC_ASSERT'
       G_STATIC_ASSERT(sizeof (unsigned long long) == sizeof (guint64));
       ^~~~~~~~~~~~~~~
    In file included from /usr/include/glib-2.0/gio/gio.h:46:0,
                     from /usr/include/gtk-3.0/gdk/gdkapplaunchcontext.h:28,
                     from /usr/include/gtk-3.0/gdk/gdk.h:32,
                     from /usr/include/gtk-3.0/gtk/gtk.h:30,
                     from /home/developer/vala/Documents/Projects/gamedev/vala-test/bin/main.vala.c:10:
    /usr/include/glib-2.0/gio/gcredentials.h: At top level:
    /usr/include/glib-2.0/gio/gcredentials.h:75:1: error: unknown type name 'uid_t'
     uid_t            g_credentials_get_unix_user      (GCredentials    *credentials,
     ^~~~~
    /usr/include/glib-2.0/gio/gcredentials.h:79:52: error: unknown type name 'uid_t'; did you mean 'pid_t'?
                                                        uid_t           uid,
                                                        ^~~~~
                                                        pid_t
    error: cc exited with status 256
    Compilation failed: 1 error(s), 0 warning(s)
    
    我也试过编译c文件,但是我得到了完全相同的结果,所以它不是一个有缺陷的版本

    虽然我设法在Windows上编译了相同的项目,所以并不是所有的都丢失了,但是我真的希望能够在没有双启动/VM的情况下完成这项工作。 我已经很接近了,我现在不想放弃

    这可能有用(main.vala):


    这是所用库的一个问题
    /usr/lib/x86_64-linux-gnu/
    /usr/include/
    是本机库的路径。
    pkg-config
    工具会为您解决这个问题。因此,在调用
    valac
    时,也要传递右侧的
    pkg config

    valac --cc x86_64-w64-mingw32-gcc-win32 \
          --pkg-config x86_64-w64-mingw32-pkg-config \
          --pkg gtk+-3.0 \
          -X -mwindows \
          ../main.vala
    
    下一步是确保在Linux机器上安装了交叉编译库。这取决于您使用的Linux发行版,例如,您可能需要安装Fedora:

    dnf install mingw64-gtk3 mingw64-glib2
    
    最后,为了便于分发,您可能需要尝试静态链接,以便将所有内容集中到一个大二进制文件中。在Fedora中有一个glib2 static包,但问题是GTK3似乎没有静态版本。否则,请查看一些有关需要打包的动态库的提示


    不幸的是,这些都没有经过测试-我没有Windows来尝试。如果有一个工作过程,可以交叉编译Vala应用程序以在Windows上运行,那就太好了。感谢您为此付出的努力,如果您能让它正常工作,那将非常有用。

    欢迎访问Stackoverflow.com!请让你的问题成为一个最小的、完整的、可验证的例子,并检查你的帖子是否可以回答。那么我做错了什么?我看了两份文件,但没有看到。是不是太技术化了?我想,“假装你在和一个忙碌的同事说话”这句话可以概括这一切,但我会这样说:/代码在哪里?只发布了错误跟踪。如果可能,它应该是可复制的,以便其他人可以帮助!我没有注意到这真管用!我并没有立即让它在ubuntu上运行,但我想:“嘿,它是docker!让我们把我的图像改成fedora吧”,所以我只是复制粘贴了你的答案,它就工作了。它甚至比在Windows上编译的二进制文件更小。我一定会看看静态链接。
    dnf install mingw64-gtk3 mingw64-glib2