Rust之linux for windows 交叉编译gtk-rs

软件包安装适用于 arch,但对于其他发行版应该类似。

首先使用 rustup 正常安装 rust。下一步将安装 windows 工具链。

rustup target add x86_64-pc-windows-gnu

vim ~/.cargo/config 插入以下内容,没有这个文件新增即可

[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
ar = "x86_64-w64-mingw32-gcc-ar"

现在安装 mingw 和 gtk 库,需要一段时间

Arch Linux

mingw 包位于 AUR 中,我们可以手动安装或使用帮助程序。这些包需要一些时间来编译。

pacaur -S mingw-w64-gcc mingw-w64-freetype2-bootstrap mingw-w64-cairo-bootstrap
pacaur -S mingw-w64-harfbuzz
pacaur -S mingw-w64-pango
pacaur -S mingw-w64-poppler
pacaur -S mingw-w64-gtk3

Fedora

Fedora 通过其存储库提供预编译的 Mingw 和 GTK 包。64 位和 32 位都可用 ( mingw64-*vs mingw32-*),可能需要 64 位包。

dnf install mingw64-gcc mingw64-pango mingw64-poppler mingw-w64-gtk3

其他发行版

GTK 不再提供 Windows 二进制文件供下载,因此对于不打包的 Mingw-GTK 包的发行版,交叉编译要困难得多。一般来说,步骤是:

  1. 下载 64 位 Mingw GTK 库。

  2. 将其解压缩到一个文件夹中。例如,将其安装在/opt/gtkwin:中mkdir -p /opt/gtkwin && unzip <file.zip> -d /opt/gtkwin

  3. 必须设置库以匹配安装文件夹:

 cd /opt/gtkwin
 find -name '*.pc' | while read pc; do sed -e "s@^prefix=.*@prefix=$PWD@" -i "$pc"; done

找到一些下载库的地方是一项挑战,并且没有理想的解决方案。三个选项是: (1) 从 Fedora RPM 中获取最多的版本,可以在这里下载;(2) 使用这里提供的古老 GTK 3.6 ;(3) 深入研究 GTK 对 Windows 的建议。但是,请务必先检查自己发行版的存储库。

扫描二维码关注公众号,回复: 15428626 查看本文章

编译

现在使用 gtk-rs创建项目。如果不想在运行时弹出终端窗口,请将以下内容添加到main.rs.

#![windows_subsystem = "windows"]

项目能在 Linux 上正常跑起来,我们就可以按照这些步骤为 Windows 编译。PKG_CONFIG_PATH应该指向你的 Mingw 的 pkgconfig 目录,而MINGW_PREFIX应该指向 Mingw 的根目录。例子:

export PKG_CONFIG_ALLOW_CROSS=1
export MINGW_PREFIX=/usr/x86_64-w64-mingw32
export PKG_CONFIG_PATH=$MINGW_PREFIX/lib/pkgconfig
cargo build --target=x86_64-pc-windows-gnu --release

对于 Fedora Mingw 的前缀是/usr/x86_64-w64-mingw32/sys-root/mingw/. 对于其他发行版,位于/opt/gtkwin或安装预编译二进制文件的任何位置。

如果在编译时遇到一些问题,可能需要考虑重新启动。另外,在使用 Glade 和 gtk-rs 时应该小心。确保 Glade 请求的版本最多等于我们系统上安装的版本。否则将无法执行。

打包

我们将在MINGW_PREFIX这里重用路径来复制相关文件以将其打包:

mkdir wherever
mkdir wherever/release
cp target/x86_64-pc-windows-gnu/release/*.exe wherever/release
cp $MINGW_PREFIX/bin/*.dll wherever/release
mkdir -p wherever/release/share/glib-2.0/schemas
cp $MINGW_PREFIX/share/glib-2.0/schemas/gschemas.compiled wherever/release/share/glib-2.0/schemas/gschemas.compiled
cp -r $MINGW_PREFIX/share/icons wherever/release/share/icons

之后,可以压缩wherever/release文件夹的内容并分发它。

可选的附加功能

图标和版本信息

这些步骤用于将图标添加到我们的程序中。首先制作一个 rc 文件,显示图标的位置和版本信息。将“path/to/my.ico”更改为我们的图标”。请参阅VERSIONINFO resource - Win32 apps | Microsoft Docs

src/program.rc:

id ICON "path/to/my.ico"
1 VERSIONINFO
FILEVERSION     1,0,0,0
PRODUCTVERSION  1,0,0,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
    BLOCK "040904E4"
    BEGIN
        VALUE "CompanyName", "My Company Name"
        VALUE "FileDescription", "My excellent application"
        VALUE "FileVersion", "1.0"
        VALUE "InternalName", "my_app"
        VALUE "LegalCopyright", "My Name"
        VALUE "OriginalFilename", "my_app.exe"
        VALUE "ProductName", "My App"
        VALUE "ProductVersion", "1.0"
    END
END
BLOCK "VarFileInfo"
BEGIN
    VALUE "Translation", 0x409, 1252
END
END

现在要制作一个构建脚本,首先将以下内容添加到Cargo.toml:

[package]
build = "build.rs"

然后在 build.rs添加以下代码

use std::process::Command;
use std::env;
use std::path::Path;

fn main() {
    let out_dir = env::var("OUT_DIR").unwrap();
    Command::new("x86_64-w64-mingw32-windres")
        .args(&["src/program.rc"])
        .arg(&format!("{}/program.o", out_dir))
        .status().unwrap();
    
    Command::new("x86_64-w64-mingw32-gcc-ar")
        .args(&["crus", "libprogram.a", "program.o"])
        .current_dir(&Path::new(&out_dir))
        .status().unwrap();

    //在为 linux 构建时,需要注释掉这两个打印。
    println!("cargo:rustc-link-search=native={}", out_dir);
    println!("cargo:rustc-link-lib=static=program");
}

Windows 10 主题

如果希望程序具有更好看的外观,可以将主题设置为 Windows 10。

mkdir /wherever/release/share/themes
mkdir /wherever/release/share/gtk-3.0

编辑/wherever/release/share/gtk-3.0/settings.ini

[Settings]
gtk-theme-name = Windows10
gtk-font-name = Segoe UI 10
gtk-xft-rgba = rgb

然后从https://b00merang.weebly.com/windows-10.html下载 Windows 10 。

unzip Windows-10-master.zip
mv Windows-10-master /wherever/release/share/themes/Windows10

猜你喜欢

转载自blog.csdn.net/love906897406/article/details/125776951