Skip to the content.

Windows でシングルバイナリを生成する

「Linux なんてよくわからん」「Windows しか使いたくない」「設定とか何もわからん」というお客様向け。

そのようなお客様に
「Microsoft Visual C++ xxxx 再頒布可能パッケージをインストールしてください」
とお願いしても
「よくわからない」
と返ってくるのが目に見えるので、静的リンクしたバイナリを送付してさしあげる。

静的リンクの設定

プロジェクトのルートから .config/config というファイルを作成する。

.
├── .cargo
│   └── config
︙

作成した config 内に以下を記述後、

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

ビルドすればよい。

> cargo build --release

静的リンクの確認

Windows では dumpbin を使うことで依存関係を確認できる。

> dumpbin.exe /DEPENDENTS <BINARY>

dumpbin.exe は大抵

Program Files (x86)\Microsoft Visual Studio\<VERSION>\BuildTools\VC\Tools\MSVC\<BUILD VERSION>\bin\Hostx64\x64

あたりにいる。

静的リンク設定前の依存関係

以下の例だと、VCRUNTIME140.dllapi-ms-win-crt で始まる C ランタイムに依存してしまっている。

うっかりこのバイナリをお客様に納品してしまうと「動かないぞ!バグってる!お前らは信用できない!」とお叱りを受けること間違いなし。

> dumpbin.exe /DEPENDENTS example.exe
Microsoft (R) COFF/PE Dumper Version 14.34.31937.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file example.exe

File Type: EXECUTABLE IMAGE

  Image has the following dependencies:

    kernel32.dll
    ws2_32.dll
    secur32.dll
    crypt32.dll
    advapi32.dll
    ntdll.dll
    bcrypt.dll
    VCRUNTIME140.dll
    api-ms-win-crt-math-l1-1-0.dll
    api-ms-win-crt-runtime-l1-1-0.dll
    api-ms-win-crt-stdio-l1-1-0.dll
    api-ms-win-crt-locale-l1-1-0.dll
    api-ms-win-crt-heap-l1-1-0.dll

  Summary

        6000 .data
       81000 .pdata
      453000 .rdata
       1A000 .reloc
      950000 .text

静的リンク設定後の依存関係

先の例で依存していた VCRUNTIME140.dllapi-ms-win-crt で始まる C ランタイムが消えていることを確認できる。

このバイナリをお客様に納品すれば「動くのは当たり前だろ?」とお褒め頂けるだろう。

> dumpbin.exe /DEPENDENTS example.exe
Microsoft (R) COFF/PE Dumper Version 14.34.31937.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file example.exe

File Type: EXECUTABLE IMAGE

  Image has the following dependencies:

    kernel32.dll
    ws2_32.dll
    secur32.dll
    crypt32.dll
    advapi32.dll
    ntdll.dll
    bcrypt.dll

  Summary

        7000 .data
       82000 .pdata
      45E000 .rdata
       1B000 .reloc
      960000 .text
        1000 _RDATA