LoginSignup
5
6

More than 5 years have passed since last update.

WindowsでvcpkgでインストールしたライブラリをRustから使う

Posted at

Rustは数値計算に使えそう

RustはGoよりも数値計算のライブラリが充実していそうです。

必要なものがcrateとして用意されているとは限りません。C/C++のライブラリ使う方法はFFIに書かれています。この例では圧縮ライブラリsnappyを使っています。

ドキュメントにはプロジェクト名の指定はなかったので

> cargo new ffi_snappy --bin

でプロジェクトを作成しました。

vcpkg

vcpkgは,Microsoft謹製のパッケージ管理システムです。vcpkgはVisual C++のプロジェクトで使うオープンソースのライブラリをビルドすることを目的としています。FreeBSDPorts 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.dlllib\snallpy.libffi_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をプロジェクトにコピー。

5
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6