vcpkg の x86-windows-static-md triplet について
vcpkg-rs を使うためにいくつか調べたのでメモ。microsoft/vcpkg は "C++ Library Manager for Windows, Linux and Mac OS" ですが今回はこれの説明はしません。
Target Triplet in vcpkg
vcpkgにはライブラリを静的にリンクするか動的にリンクするかを指定するために x64-windows-static
と x64-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_DYNAMIC
と RUSTFLAGS
を見て処理を切り替えます。Rust 側で CRT を静的リンクしたい場合は RUSTFLAGS=-Ctarget-feature=+crt-static
と指定しますが、vcpkg-rs はこの時 x64-windows-static
を使用するように切り替えます。
Discussion