🦀

vcpkg の x86-windows-static-md triplet について

2021/05/01に公開

vcpkg-rs を使うためにいくつか調べたのでメモ。microsoft/vcpkg は "C++ Library Manager for Windows, Linux and Mac OS" ですが今回はこれの説明はしません。

Target Triplet in vcpkg

vcpkgにはライブラリを静的にリンクするか動的にリンクするかを指定するために x64-windows-staticx64-windows というビルドターゲット文字列 (triplet) を使います。例えば

vcpkg install openblas --triplet x64-windows

例えばこれでOpenBLASが動的ライブラリ (.dll) としてビルドされ、

vcpkg install openblas --triplet x64-windows-static

これでOpenBLASが静的ライブラリ (.a) としてビルドされます。

実はここにもう1つ種類があって x64-windows-static-md というものがあります

vcpkg install openblas --triplet x64-windows-static

これはライブラリ(この場合OpenBLAS)はstaticにC Runtime (CRT) はdynamicにリンクします。これによりビルド成果物にCRT分が含まれないのでサイズが小さくできます。代わりに実行時にCRTを検索する事になります。

このTripletは vcpkg 本家ではなくコミュニティ管理になっています。Why should x64-windows-static-md not be the preferred triplet on Windows? この辺が詳しいです。

vcpkg-rs は3通りともサポートしており環境変数 VCPKGRS_DYNAMICRUSTFLAGS を見て処理を切り替えます。Rust 側で CRT を静的リンクしたい場合RUSTFLAGS=-Ctarget-feature=+crt-static と指定しますが、vcpkg-rs はこの時 x64-windows-static を使用するように切り替えます。

GitHubで編集を提案

Discussion