BETA

Rustでopenssl等をMSVCでコンパイルするとエラーが発生します(´・ω・`)

投稿日:2019-09-06
最終更新:2019-09-15

RustをMSVCを使ってコンパイルしてると、こんな感じにエラーが発生することがあります。

PS > cargo build  
   Compiling pkg-config v0.3.15  
   Compiling cc v1.0.42  
   Compiling vcpkg v0.2.7  
   Compiling autocfg v0.1.6  
   Compiling libc v0.2.62  
   Compiling bitflags v1.1.0  
   Compiling openssl v0.10.24  
   Compiling foreign-types-shared v0.1.1  
   Compiling lazy_static v1.4.0  
   Compiling cfg-if v0.1.9  
   Compiling foreign-types v0.3.2  
   Compiling openssl-sys v0.9.49  
error: failed to run custom build command for `openssl-sys v0.9.49`  

Caused by:  
  process didn't exit successfully: `C:\repos\test001\target\debug\build\openssl-sys-32aa0e4e13364df8\build-script-main` (exit code: 101)  
--- stdout  
cargo:rustc-cfg=const_fn  
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_MSVC_OPENSSL_LIB_DIR  

~~~中略~~~  

It looks like you're compiling for MSVC but we couldn't detect an OpenSSL  
installation. If there isn't one installed then you can try the rust-openssl  
README for more information about how to download precompiled binaries of  
OpenSSL:  

https://github.com/sfackler/rust-openssl#windows  

', C:\Users\saito\.cargo\registry\src\github.com-1ecc6299db9ec823\openssl-sys-0.9.49\build\find_normal.rs:150:5  
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.  

こういう時はまず、MSVC用のパッケージマネージメントのツール(vcpkg)をインストールして、
必要パッケージをあらかじめコンパイルしておく必要があります。

VCPKGのインストール

https://github.com/microsoft/vcpkg

基本的にドキュメント通りに行えばインストール可能です。
またVisualStudio側の構成であらかじめ「英語」の言語をインストールする必要があります。

必要なパッケージのインストール

今回はopenssl-sysにはopensslのライブラリが必要です。

PS > .\vcpkg.exe search openssl  
curl[openssl]                         SSL support (OpenSSL)  
ffmpeg[openssl]                       openssl support in ffmpeg  
freetds[openssl]                      OpenSSL support  
ixwebsocket[openssl]                  SSL support (OpenSSL)  
libarchive[openssl]                   OpenSSL support  
librdkafka[ssl]                       Build with OpenSSL  
libressl             2.9.1-2          LibreSSL is a version of the TLS/crypto stack forked from OpenSSL in 2014, wit...  
libressl[tools]                       Build openssl and ocspcheck executables  
libzip[openssl]                       AES (encryption) support using OpenSSL  
openssl              1                OpenSSL is an open source project that provides a robust, commercial-grade, an...  
openssl-unix         1.0.2s-1         OpenSSL is an open source project that provides a robust, commercial-grade, an...  
openssl-uwp          1.0.2r           OpenSSL is an open source project that provides a robust, commercial-grade, an...  
openssl-windows      1.0.2s-1         OpenSSL is an open source project that provides a robust, commercial-grade, an...  
restbed[openssl]                      Secure over the wire communication allowing you to transmit private data online.  

If your library is not listed, please open an issue at and/or consider making a pull request:  
    https://github.com/Microsoft/vcpkg/issues  

こんな感じで必要そうなパッケージを検索します。
今回でいうとopensslをインストールします
install時に「:x64-windows-static」をつけていますが、64bitのWindows用で静的ライブラリを作る場合はこのようにするみたいです。

PS C:\repos\vcpkg> .\vcpkg.exe install openssl:x64-windows-static  
The following packages will be built and installed:  
    openssl[core]:x64-windows-static  
  * openssl-windows[core]:x64-windows-static  
Additional packages (*) will be modified to complete this operation.  
Starting package 1/2: openssl-windows:x64-windows-static  
Building package openssl-windows[core]:x64-windows-static...  
-- Using cached C:/repos/vcpkg/downloads/openssl-1.0.2s.tar.gz  
-- Using source at C:/repos/vcpkg/buildtrees/openssl-windows/src/openssl-1-c41872ef97  
-- Copying openssl release source files...  

~~~中略~~~  

Elapsed time for package openssl:x64-windows-static: 1.194 s  

Total elapsed time: 2.23 min  

The package openssl is compatible with built-in CMake targets:  

    find_package(OpenSSL REQUIRED)  
    target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto)  

ビルド

このままコンパイルをしてもエラーになってしまいます。
最後に環境編集「RUSTFLAGS」に「-Ctarget-feature=+crt-static」を加えます。

PS > $env:RUSTFLAGS = '-Ctarget-feature=+crt-static'  

これでcargo buildでしてもコンパイルエラーが発生しなくなります。

補足

これはopenssl以外にも、libpqが必要なdiesel_cliをインストールする際にも使えます(´▽`)
と思ったのですが、残念ながらlibpqのバージョンが古くてダメみたいですね_| ̄|○
~~
~~PostgreSQLのWindows版をインストールして、その中のlibpq.libを使うのがよいみたいです。。。

*2019/09/15 追記 diesel_cliがどうやってもコンパイルできませんでした。slackとかで聞いてみたりしましたが私にはハードそうなのでwindowsのgnu版でやることにします。 *

補足2

それとは別にLLVMが必要でコンパイルできないのとかもありました。。。

http://releases.llvm.org/download.html

こちらからWindows用のをインストール(してPATH通したら?)したら解決しました。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@saitooooの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!