Rustは数値計算に使えそう
RustはGoよりも数値計算のライブラリが充実していそうです。
必要なものがcrateとして用意されているとは限りません。C/C++のライブラリ使う方法はFFIに書かれています。この例では圧縮ライブラリsnappyを使っています。
ドキュメントにはプロジェクト名の指定はなかったので
> cargo new ffi_snappy --bin
でプロジェクトを作成しました。
vcpkg
vcpkgは,Microsoft謹製のパッケージ管理システムです。vcpkgはVisual C++のプロジェクトで使うオープンソースのライブラリをビルドすることを目的としています。FreeBSDのPorts collectionを手本にしていますが,portsファイルはCMakeで書かれています。
vcpkgでsnappyをインストールします。
.\vcpkg install snappy:x64-windows
vcpkgは様々なプラットフォーム(triplet)向けのコンパイルが可能です。平成も30年ですが,デフォルトはx86-windows
(32-bit)なので,:x64-windows
を指定しました。
Rustからsnappyを使う
dllとlibをコピー
パッケージはinstalled\x64-windows
にインストールされます。vcpkgでは,共有ライブラリをプロジェクトにコピーして使うことを想定しているようです。ここでもそれに従ってbin\snappy.dll
とlib\snallpy.lib
をffi_snappy
にコピーしました。
静的ライブラリ(snappy:x64-windows-static)をインストールしてinstalled\x64-windows-static\lib\snappy.lib
をコピーした場合はcargo build
はうまくいきましたが,cargo run
でエラーが出ました。
dllをコピーしlibをbuild.rsで指定
プロジェクトのルートにbuild.rs
を置く方法もあります。
fn main() {
println!("cargo:rustc-link-search=native=path-to-vcpkg/installed/x64-windows/lib/");
}
この場合でもbin\snappy.dll
はコピーしないとcargo run
でエラーが出ます。rustc-link-search
のあとは=
です。最初は-
かと思いましたが,-
では正しくリンクされません。
installed\x64-windows\bin
(共有ライブラリ)x86-windows-static\lib
(静的ライブラリ)を指定したときは
= note: Non-UTF-8 output: ffi_snappy-d4b8872a8faeecc5.ffi_snappy0.rcgu.o : error LNK2019: \x96\xa2\x89...
というエラーが出てしまいました。
まとめ
vcpkgでライブラリをインストール。dllとlibをプロジェクトにコピー。