我通常只用高级代码编写代码,因此我完全没有编译代码的经验(因为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上编译的二进制文件还要小。 而且,我一定会看看静态链接。