♻️
Rustのhyperがopenssl絡みでコンパイル出来ないときの対処法 (Windows編)
環境
- Windows10
- Rust 1.8.0 Windows 64bit (MSVC ABI)
- hyper v0.9
- Visual Studio 2015
- OpenSSL Win64 v1.0.2h
最初のエラー
まず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.libとeay32.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