♻️

Rustのhyperがopenssl絡みでコンパイル出来ないときの対処法 (Windows編)

2020/09/26に公開

環境

最初のエラー

まずcargo newします。

$ cargo new --bin hyper_hello

そして Cargo.toml

...
[dependencies]
hyper = "0.9"

hyper を追加して cargo run すると

$ cargo run
...
...
Build failed, waiting for other jobs to finish...
failed to run custom build command for `openssl v0.7.11`
Process didn't exit successfully: `%USERPROFILE%\hyper_hello\target\debug\build\openssl-5eb24e119ff837c6\build-script-build` (exit code: 101)
--- stderr
thread '<main>' panicked at 'explicit panic', %USERPROFILE%\.cargo\registry\src\github.com-88ac128001ac3a9a\gcc-0.3.28\src\lib.rs:840
note: Run with `RUST_BACKTRACE=1` for a backtrace.

と怒られますが、これはhyperが使っているrust-opensslのエラーです。
なのでこれのREADMEの通りにMSYS2を入れるかOpenSSLを入れるかして下さい。
私はOpenSSLを入れる方でやったので今回はこの方法で話を進めます。

OpenSSLをインストールしたあとREADME通りに環境変数を設定してcargo runします。ちなみにインストールする場所はCドライブ直下じゃなくてもいいです。あとVisual Studio 2013も必要なのでインストールしておいてください。2015でもいいです。

$ setx OPENSSL_LIB_DIR "C:/OpenSSL-Win64"
$ setx OPENSSL_INCLUDE_DIR "C:/OpenSSL-Win64/include"
$ cargo run
...
Hello, world!

2つ目のエラー

とりあえずデフォルトのHello, worldはコンパイル出来たのでmain.rsをいじります。
とりあえずhyperのサンプルをコピペします。

extern crate hyper;

use hyper::Server;
use hyper::server::Request;
use hyper::server::Response;

fn hello(_: Request, res: Response) {
    res.send(b"Hello World!").unwrap();
}

fn main() {
    Server::http("127.0.0.1:3000").unwrap()
        .handle(hello).unwrap();
}

そしてcargo run

$ cargo run

...
error: linking with `link.exe` failed: exit code: 1181
note: ...
...
note: Non-UTF-8 output: LINK : fatal error LNK1181: ... \'ssl32.lib\' ...
error: aborting due to previous error
Could not compile `hyper_hello`.

どうやらリンクに失敗しているようです。よく見るとssl32.libeay32.libが見つからないそうなのでコピーします。

$ copy C:\OpenSSL-Win64\lib\VC\libeay32MT.lib C:\OpenSSL-Win64\eay32.lib
$ copy C:\OpenSSL-Win64\lib\VC\ssleay32MT.lib C:\OpenSSL-Win64\ssl32.lib

そしてcargo run

$ cargo run
   Compiling hyper_hello v0.1.0 (hyper_hello)
     Running `target\debug\hyper_hello.exe`

コンパイルできましたか?
あとはブラウザでlocalhost:3000にアクセスすると**Hello World!**が表示されるはずです。

Discussion