Sworld

Sworld

The only way to do great work is to love what you do.

Win上でRustプログラムをMacOSとLinuxにコンパイルする

以前、Windows で Linux 向けの Rust プログラムをコンパイルする方法についての記事を書きましたが、Rust のネイティブな設定方法はそれほど簡単ではありません。今日は、Rust プログラムを MacOS および Linux にコンパイルするためのより簡単な方法を紹介したいと思います。同様に、これらのプラットフォームから Windows にコンパイルすることもできます。

Cross-rs#

Cross-rsは Rust のクロスコンパイルツールで、依存関係が複雑でない場合、ほぼ 1 つのコマンドで Rust プログラムを他のプラットフォームにコンパイルできます。その原理は、Docker を使用してクロスコンパイルのツールチェーンを実行することですので、マシンに Docker または Podman が必要です。このライブラリはテストもサポートしていますが、これは本記事の焦点ではないため、ここで触れるだけにします。

インストール#

注意すべきは、このプロジェクトが Docker に依存しているため、コンパイル時にはネットワークが正常である必要があり、Docker Hub のイメージのダウンロード速度が非常に遅い場合があるため、迅速にアクセスできるイメージソースを使用することをお勧めします。

Rust ツールチェーン、Docker または Podman がすでにインストールされていることを確認したら、以下のコマンドで cross をインストールします:

cargo install cross --git https://github.com/cross-rs/cross

基本的な使い方#

簡単なプロジェクトの場合、インストールが完了したら、直接 cross を使用してコンパイルできます:

# ターゲットアーキテクチャがx86_64のLinuxにコンパイル
cross build --target x86_64-unknown-linux-gnu --release
# ターゲットアーキテクチャがaarch64のLinuxにコンパイル
cross build --target aarch64-unknown-linux-gnu --release

ここでは、以前に練習で書いたSocks5 プロキシソフトウェアを例に、コンパイル結果は以下の通りです:

cross build --target x86_64-unknown-linux-gnu --release

# info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
# info: latest update on 2025-03-18, rust version 1.85.1 (4eb161250 2025-03-15)
# info: downloading component 'cargo'
# ......
# info: checking for self-update
# info: downloading component 'rust-src'
# info: installing component 'rust-src'

# Unable to find image 'ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main' locally
# main: Pulling from cross-rs/x86_64-unknown-linux-gnu
# d9802f032d67: Pull complete
# ......
# b4f2b8f6bece: Pull complete
# Digest: sha256:e01aa4c146da3834f49ead052f7f9b9cff95e3dd576f909c87cea473bba84e1b
# Status: Downloaded newer image for ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main

#    Compiling libc v0.2.159
# ......
#    Compiling tokio-byteorder v0.3.0
#    Compiling socks5_tcp v0.1.0 (/mnt/d/socks5_tcp)
#     Finished `release` profile [optimized] target(s) in 58.03s

基本的には以下のいくつかの段階に分かれます:

  1. ターゲットプラットフォームのツールチェーンをインストール
  2. コンパイル用の Docker イメージをダウンロード
  3. プログラムをコンパイル

これで、Linux 上で実行可能なファイルが得られ、target/x86_64-unknown-linux-gnu/release/socks5_tcpにあります。しかし、複雑なプロジェクトに直面した場合、外部依存関係を処理する必要があるかもしれません。また、MacOS または MSVC ターゲットにコンパイルする場合、いくつかの追加設定を処理する必要があります。以下の章を参照してください。

外部依存関係の処理#

コンパイルプロセスをカスタマイズするために、プロジェクトのルートディレクトリにCross.tomlファイルを作成する必要があります。内容は以下の通りです:

# ここでの形式は `target.<target-triple>` で、異なるターゲットの設定を複数持つことができます
[target.aarch64-unknown-linux-gnu]
# pre-buildでは、コンパイル前にいくつかのコマンドを実行できます。依存関係のインストールによく使われます
pre-build = [
    "apt-get update",
    "apt-get install -y libssl-dev",
]
# imageを使ってDockerイメージを指定することもできます
image = "test-image"
# 環境変数を指定
env.aaa = "bbb"

基本的に設定方法は上記の通りです。さらにカスタマイズが必要な場合は、公式ドキュメントを参照してください。

MacOS へのコンパイル#

ライセンス上の理由から、cross-rsチームは私たちに事前にコンパイルされたイメージを提供することができず、Apple の SDK を配布することも許可されていないため、私たちは合法的に SDK を入手し、それを使ってイメージをコンパイルする必要があります。以下にaarch64-apple-darwinを例に示しますが、他のプラットフォームも同様です。

イメージのコンパイル#

cross-rsのコードをクローンし、サブモジュールを更新し、設定を完了した後にイメージを構築する必要があります:

# クロスツールチェーンをセットアップ
git clone https://github.com/cross-rs/cross
cd cross
git submodule update --init --remote
cargo xtask configure-crosstool

# Dockerイメージをビルド
cargo build-docker-image aarch64-apple-darwin-cross --build-arg 'MACOS_SDK_URL=https://github.com/joseluisq/macosx-sdks/releases/download/12.3/MacOSX12.3.sdk.tar.xz' --tag local

# アプリケーションをコンパイル
cross build --target aarch64-apple-darwin --release

SDK のバージョンに関する要件は以下の通りです:

  • i686-apple-darwin: SDK <= 10.13
  • x86_64-apple-darwin: SDK <= 13.0 または SDK <= 12.4
  • aarch64-apple-darwin: SDK >= 10.16 かつ (SDK <= 13.0 または SDK <= 12.4)

Cross.tomlの設定#

ビルドが完了したら、非常に簡単です。プロジェクトのルートディレクトリにCross.tomlファイルを作成し、対応するターゲットに私たちのローカルイメージを指定します。内容は以下の通りです:

# 参照: https://github.com/cross-rs/cross-toolchains
[target.aarch64-apple-darwin]
image = "ghcr.io/cross-rs/aarch64-apple-darwin-cross:local"

その後のコンパイルは Linux と同様で、詳細は省略します。

Windows へのコンパイル#

MSVC は Windows で最適なターゲットかもしれませんが、便宜上、GNU ツールチェーンを選択しました。x86_64-pc-windows-gnuまたはi686-pc-windows-gnuをターゲットとして使用でき、コンパイル方法は Linux と似ています:

cross build --target x86_64-pc-windows-gnu --release

これで、Linux または MacOS 上で Windows 用の実行可能ファイルをコンパイルでき、MSVC の設定は不要です。もし MSVC のコンパイル結果が非常に欲しい場合は、公式リポジトリの README や Issue を自分で読んでください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。