win gcc编译linux,关于gcc:从Linux for Windows编译Vala

我通常只用高级代码编写代码,因此我完全没有编译代码的经验(因为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):

using Gtk;

int main(string[] args) {

Gtk.init(ref args);

var window = new Window();

window.title ="First GTK+ Program";

window.border_width = 10;

window.window_position = WindowPosition.CENTER;

window.set_default_size(350, 70);

window.destroy.connect(Gtk.main_quit);

var button = new Button.with_label("Click me!");

button.clicked.connect(() => {

button.label ="Thank you";

});

window.add(button);

window.show_all();

Gtk.main();

return 0;

}

欢迎来到Stackoverflow.com! 请让您的问题成为最小,完整和可验证的示例MVCE。还要检查如何提问以使您的帖子可以回答。

那我做错了什么? 我读了两个文档,但看不到。 太技术性了吗? 我认为"假装与忙碌的同事交谈"这一行总结了全部内容,但这就是我要做的。 :/

代码在哪里? 仅张贴了错误跟踪。如果可能,它应该是可复制的,以便其他人可以提供帮助

哎呀! 我没有注意。 :p

这是所用库的问题。 /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上分发GTK +应用程序?有关需要打包的动态库的一些提示。

不幸的是,这些都没有经过测试-我没有Windows可以尝试。拥有一个可交叉编译Vala应用程序以使其在Windows上运行的工作过程将非常好。感谢您为实现这一目标而付出的努力,这将有助于您了解它是否起作用。

这可行! 我没有立即使它在ubuntu上工作,但我想:"嘿,它是docker!让我将映像更改为fedora",所以我只复制粘贴了您的答案即可。 它甚至比Windows上编译的二进制文件还要小。 而且,我一定会看看静态链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值