web-dev-qa-db-ja.com

静的にリンクされた実行可能ファイルを生成する方法は?

Rustで静的実行可能ファイルを作成しようとしています。私はnot特定のライブラリを静的にリンクしようとしています。動的リンクをまったく使用しないの実行可能ファイルを作成しようとしています。私は次の(そうでなければ機能する)テストをしています:

$ cat hello.rs
fn main()
    {
    print!("Hello, world!\n");
    }
$ rustc hello.rs -o hello
$ file hello
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
 dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, [etc]

dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2。静的実行可能ファイルにはstatically linked代わりに。 (そして私の場合corrupted section header size、ただし、Rust to replicate that ..)

実際の静的実行可能ファイルを生成するためにrustcに渡す必要があるオプションは何ですか(具体的には、fileでも同意するものは静的にリンクされます)。

33
David X

Rustはデフォルトでglibc(およびlibgcc、iirc)を除くすべてを静的にリンクします。

100%静的にリンクされたバイナリを取得する場合は、1.1でMUSLを使用できます。 https://github.com/Rust-lang/Rust/pull/24777 が初期サポートです。将来的にはさらに使いやすくなることを願っています。

20
Steve Klabnik

Rust 1.19 なので、Cランタイム(CRT)を静的にリンクして、Windowsでこの非常に一般的な状況を回避できます。

コンピューターにVCRUNTIME140.dllが見つからないため、プログラムを開始できません。プログラムを再インストールして、この問題を修正してください。

これを.cargo/configファイルに追加し、プラットフォームに適したターゲットトリプルを使用します。

[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]

.cargo/configを編集する代わりに、-C target-feature=+crt-staticを手動でrustcに渡すこともできます。

以下も参照してください。

14
arkod