Help us understand the problem. What is going on with this article?

RubyをWindows上でVisual C++でビルドする2018

普通はRubyInstallerを使うんで、あえて茨の道を行きたい人向けです。以下の記事のアップデート版

ruby-mswinとは

Microsoft Visual C++を用いて作成されるCRubyです。これはmingw版やcygwin版などとバイナリ互換性がなく、それら用にコンパイルされた拡張ライブラリを用いることが出来ません。

Visual C++

まずはコンパイラの調達です。すでにVisual Studioをインストール済みならばそれを使えばいいのですが、そうでない場合はBuild Tools for Visual Studio 2017というIDEなしのインストーラを使うと速いです。

インストーラを実行したら以下を選択の上でインストールします。

  • 個別のコンポーネント
    • Windows ユニバーサル CRT
    • Visual C++ Build Tools のコア機能
    • VC++ 2017 バージョン 15.8 v14.15 最新の v141 ツール
    • Windows 10 SDK (10.0.17134.0)
  • 言語パック
    • 英語

以降、コマンドプロンプトはスタートメニューの「Visual Studio 2017」→「VS 2017用 x64 Native Tools コマンドプロンプト」を用います。

BASERUBY

Rubyをソースコードからビルドする場合、特にtarballからではなくリポジトリから取得した場合にはbisonやgrep、sedといったUnixツールが必要ですし、なんとRubyまで必要です。個別に調達すると大変なので、たとえVisual C++でビルドするのだとしても、RubyInstaller(WITH DEVKITかつx64のもの)をインストールしましょう。インストール中にdevkitのインストールを促されるのでそれも入れます。

インストールできたらC:\Ruby25-x64\msys64\mingw64.exeを実行し、mingw64用msysを起動し、以下の通りbisonとgitをインストールします。

pacman -S bison git

注1: Unixツールは従来Git for Windows SDKを用いる方法を紹介していましたが、RubyInstaller2ではMSYS2を用いるようになったため、RubyInstallerのみで事足りるようになりました
注2: BASERUBYはWSLを用いる方法もあるかもしれません

vcpkg

ruby-mswin版のインストールにおいて、従来大きなハードルになっていたのが拡張ライブラリの依存先ライブラリのビルドです。しかし2016年、vcpkgの登場によってだいぶ便利になりました。以下のようにインストールした後、Rubyで必要となるライブラリをビルドします。

\Ruby25-x64\usr\bin\git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
bootstrap-vcpkg.bat
vcpkg --triplet x64-windows install libxml2 libxslt openssl readline zlib

環境変数

前述の通り、VS2017 x64 Native Tools コマンド プロンプトなどを用いてコンパイラ等の環境変数はあらかじめ設定しているものとして、以下の環境変数を設定します。

set PATH=C:\vcpkg\installed\x64-windows\bin;%PATH%;C:\Ruby25-x64\msys64\usr\bin

ポイントはvcpkgのものを冒頭に置くということですね。前述の通りRubyInstallerのDLLはruby-mswinと互換性がないため、それらではなくvcpkgで入れた物を見つけられるよう、先に指定する必要があります。

Rubyのビルド

以下の通りでビルド・インストールできます。(パスは適当に読み替えてください)

win32\configure.bat --with-opt-dir=/vcpkg/installed/x64-windows
nmake install

なお、libxml2やlibxsltをvcpkgで入れているため、従来mswinでは使うことが難しかったNokogiriもRubyGemsから以下の通りインストールすることが可能です。

gem install nokogiri -- --use-system-libraries --with-xml2-dir=/vcpkg/installed/x64-windows --with-xslt-dir=/vcpkg/installed/x64-windows --with-exslt=/vcpkg/installed/x64-windows

FAQ

以下のようなエラーが出る

C:\>gem install reline-0.0.2.gem
ERROR:  Loading command: install (LoadError)
        126: The specified module could not be found.   - C:/Ruby27-reline/lib/ruby/2.7.0/x64-mswin64_140/openssl.so
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

一般化すると、ビルドした .so ファイルがロードできないというエラーですね。多くの場合これは openssl.so が依存しているDLLファイルが適切にロードされていないからであり、おそらくMSYS用のライブラリが読み込まれてしまっています。

解決策としては上述の「環境変数」の項目を参考に PATH を適切に設定すれば直ります。

nurse
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした