web-dev-qa-db-ja.com

Windows 7で「gemネイティブ拡張の構築に失敗しました」(システムは指定されたパスを見つけることができません)

要するに問題

Windowsを使用していて、gem install json —platform=Rubyを実行すると次のエラーが発生します。

The system cannot find the path specified.
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
The system cannot find the path specified.
ERROR:  Error installing json:
    ERROR: Failed to build gem native extension.

    C:/Ruby193/bin/Ruby.exe extconf.rb
creating Makefile


Gem files will remain installed in C:/Ruby193/lib/Ruby/gems/1.9.1/gems/json-1.8.1 for inspection.
Results logged to C:/Ruby193/lib/Ruby/gems/1.9.1/gems/json-1.8.1/ext/json/ext/generator/gem_make.out

背景といくつかの調査

最初に、私はWindowsの人間ではないので、これは私にとって勇敢な新しい世界です。ライブラリの狂ったコレクションが散らばった仕事からラップトップを継承したので、以前にインストールしたRubyとDevkit)をすべて削除して、次のものをインストールしました。

  • Ruby 1.9.3p484 Ruby InstallerC:/Ruby193
  • Ruby 2.0.0p353 RubyインストーラーC:/Ruby200
  • Devkit DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe(Ruby 1xの場合)をC:/Ruby193-devkitに抽出
  • Devkit DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe(Ruby 2xの場合は32ビット)がC:/Ruby200-devkit-x32に抽出されます。

次に Pik 0.2.8 をgemとしてインストールし、インストール手順に従ってpik_installを新しいディレクトリC:/binに実行しました。

私のPATHは次のようになります:

PATH=C:\bin;C:\Ruby193\bin;C:\windows;C:\windows\system32;C:\windows\system32\Wbem;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files (x86)\Common Files\Roxio Shared\DLLShared\;C:\Program Files\Java\jdk1.6.0_33\bin;C:\Program Files (x86)\Common Files\Apple\Mobile Device Support\;C:\Program Files (x86)\Common Files\Apple\Apple Application Support;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files\TortoiseSVN\bin;C:/inpath;C:\Program Files (x86)\WinMerge;C:\ChromeDriver;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM\Bluetooth Software\syswow64

重要なのは、C:/binC:/Ruby193/binがパスに含まれていることです。つまり、シェルを起動すると、デフォルトでRuby 1.9.3がロードされ、pik use 2.0.0p353を使用して2.0.0に正常に切り替えることができます。つまり、pikは正常に動作します。

Devkit 意図されている Windows上のgemからネイティブC/C++バイナリをコンパイルできるようにして、プリコンパイルされたWindowsバイナリを使用できるようにします。

Rubyの2つのバージョンがインストールされており、それぞれに異なるdevkit(2x用と1x用)が必要)があるため、devkitのセットアップを2回実行する必要がありました。

cd C:/Ruby193-devkit
Ruby dk.rb init
# Edit config.yml to remove all but Ruby193
Ruby dk.rb install

cd C:/Ruby200-devkit
Ruby dk.rb init
# Edit config.yml to remove all but C:/Ruby200
Ruby dk.rb install

この時点でgem install json —platform=Rubyを正常に実行できるはずですが、上記のエラーが発生しました。少し掘り下げた後 私はこれを発見しました 、COMSPECが正しく設定されていることを確認し、HKEY_CURRENT_USER\Software\Microsoft\Command ProcessorからAutoRunキーを削除することをお勧めします。

残念ながら、私はまだjson gemをインストールできませんでした。

次に、おそらく間違ったバージョンのGCCが使用されているか、見つからないことに気付きました。 Devkitの2つのバージョンには、gccの異なるバージョンが付属しています。

> C:\Ruby193-devkit\mingw\bin\gcc —version
gcc (tdm-1) 4.5.2

> C:\Ruby200-devkit-x32\mingw\bin\gcc —version
gcc (rubenv-4.7.2-release) 4.7.2

次に、pikが特定のバージョンのRuby私が選んだバージョン)のdevtoolsのバージョン(したがってgcc)をロードしておらず、常に1.9.3を使用していたのではないかと思った。 この記事 、そうではないようです:

> pik use 193
> where Ruby
C:\Ruby193\bin\Ruby.exe

> cat C:\Ruby193\lib\Ruby\site_Ruby\devkit.rb
# enable RubyInstaller DevKit usage as a vendorable helper library
unless ENV['PATH'].include?('C:\\Ruby193-devkit\\mingw\\bin') then
  puts 'Temporarily enhancing PATH to include DevKit...'
  ENV['PATH'] = 'C:\\Ruby193-devkit\\bin;C:\\Ruby193-devkit\\mingw\\bin;' + ENV['PATH']
end
ENV['RI_DEVKIT'] = 'C:\\Ruby193-devkit'
ENV['CC'] = 'gcc'
ENV['CXX'] = 'g++'
ENV['CPP'] = 'cpp'


> pik use 200
> where Ruby
C:\Ruby200\bin\Ruby.exe

> cat C:\Ruby200\lib\Ruby\site_Ruby\devkit.rb
# enable RubyInstaller DevKit usage as a vendorable helper library
unless ENV['PATH'].include?('C:\\Ruby200-devkit-x32\\mingw\\bin') then
  phrase = 'Temporarily enhancing PATH to include DevKit...'
  if defined?(Gem)
    Gem.ui.say(phrase) if Gem.configuration.verbose
  else
    puts phrase
  end
  puts "Prepending ENV['PATH'] to include DevKit..." if $DEBUG
  ENV['PATH'] = 'C:\\Ruby200-devkit-x32\\bin;C:\\Ruby200-devkit-x32\\mingw\\bin;' + ENV['PATH']
end
ENV['RI_DEVKIT'] = 'C:\\Ruby200-devkit-x32'
ENV['CC'] = 'gcc'
ENV['CXX'] = 'g++'
ENV['CPP'] = 'cpp'

(私は実際にはウィンドウで猫を利用できませんが、それはより明確な説明になります)

ご覧のとおり、正しいバージョンのdevkitがdevkit.rbによってパスに追加されているようです。これは、エラーに「一時的にPATHを拡張してDevKitを含める…」が含まれているため、ロードされています。

元のエラーに戻る

そうだった:

The system cannot find the path specified.
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
The system cannot find the path specified.
ERROR:  Error installing json:
    ERROR: Failed to build gem native extension.

    C:/Ruby193/bin/Ruby.exe extconf.rb
creating Makefile


Gem files will remain installed in C:/Ruby193/lib/Ruby/gems/1.9.1/gems/json-1.8.1 for inspection.
Results logged to C:/Ruby193/lib/Ruby/gems/1.9.1/gems/json-1.8.1/ext/json/ext/generator/gem_make.out

残念ながら、結果ログはヘルプの点で正確には多くを提供していません。これは、gem_make.outのようになります。

C:/Ruby193/bin/Ruby.exe extconf.rb
creating Makefile

extconf.rbが役立つかもしれないと思ったのですが、頭も尾もできません。

require 'mkmf'

unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3')
  $CFLAGS << ' -O3'
end
if CONFIG['CC'] =~ /gcc/
  $CFLAGS << ' -Wall'
  unless $DEBUG && !$CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb')
    $CFLAGS << ' -O0 -ggdb'
  end
end

$defs << "-DJSON_GENERATOR"
create_makefile 'json/ext/generator'

C:/Ruby193/lib/Ruby/gems/1.9.1/gems/json-1.8.1/ext/json/ext/generatorのMakefile このように見えます 。このMakefileが作成されているのも奇妙に思えます。

Windows/Rubyの経験がもう少しあれば、これに光を当てることができればすばらしいでしょう。

PS。私はWindows 7 Professional SP1を使用しています

さらに掘り下げてから更新

だから私は、devkitが正しいdevkitディレクトリを使用してパスを改善していたことを確認したかったのです。別のSO質問の提案のおかげで、私はdevkitインストールをRubyディレクトリ内に移動しました:

Tdm開発キットはC:\Ruby193\devkitにあり、mingw64はC:\Ruby200\devkitにあります。各devkitに対してRuby dk.rb install -fを実行した後、両方のdevkit.rbファイルを開いて、パスが正しく更新されていることを確認しました。それらがあり、プットを更新したので、「一時的に強化されたPATHにはDevKit for 1.9が含まれています」または「一時的に強化されたPATHにはDevKit for 2が含まれています」と出力されます。正しいdevkitがロードされていることを確認するために:

C:\>pik 193

C:\>Ruby -rdevkit -ve "puts ENV['PATH']"
Ruby 1.9.3p484 (2013-11-22) [i386-mingw32]
Temporarily enhancing PATH to include DevKit for 1.9...
C:\Ruby193\devkit\bin;C:\Ruby193\devkit\mingw\bin;C:\bin;C:\Ruby193\bin;C:\windows;C:\windows\system32;C:\windows\system32\Wbem;c:\Program Files (x86)
\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Pro
gram Files (x86)\Common Files\Roxio Shared\DLLShared\;C:\Program Files\Java\jdk1.6.0_33\bin;C:\Program Files (x86)\Common Files\Apple\Mobile Device Su
pport\;C:\Program Files (x86)\Common Files\Apple\Apple Application Support;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files\TortoiseSVN\bin
;C:/inpath;C:\Program Files (x86)\WinMerge;C:\ChromeDriver;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM\Bluetooth Software\sy
swow64

C:\>pik 200

C:\>Ruby -rdevkit -ve "puts ENV['PATH']"
Ruby 2.0.0p353 (2013-11-22) [i386-mingw32]
Temporarily enhancing PATH to include DevKit for 2...
C:\Ruby200\devkit\bin;C:\Ruby200\devkit\mingw\bin;C:\bin;C:\Ruby200\bin;C:\windows;C:\windows\system32;C:\windows\system32\Wbem;c:\Program Files (x86)
\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Pro
gram Files (x86)\Common Files\Roxio Shared\DLLShared\;C:\Program Files\Java\jdk1.6.0_33\bin;C:\Program Files (x86)\Common Files\Apple\Mobile Device Su
pport\;C:\Program Files (x86)\Common Files\Apple\Apple Application Support;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files\TortoiseSVN\bin
;C:/inpath;C:\Program Files (x86)\WinMerge;C:\ChromeDriver;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM\Bluetooth Software\sy
swow64

すべてが正しく動作するように見えるように。だが:

C:\>gem install json --platform=Ruby
Temporarily enhancing PATH to include DevKit for 2...
Building native extensions.  This could take a while...
The system cannot find the path specified.
ERROR:  Error installing json:
        ERROR: Failed to build gem native extension.

    C:/Ruby200/bin/Ruby.exe extconf.rb
creating Makefile


Gem files will remain installed in C:/Ruby200/lib/Ruby/gems/2.0.0/gems/json-1.8.1 for inspection.
Results logged to C:/Ruby200/lib/Ruby/gems/2.0.0/gems/json-1.8.1/ext/json/ext/generator/gem_make.out

C:\>pik 193

C:\>gem install json --platform=Ruby
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
The system cannot find the path specified.
ERROR:  Error installing json:
        ERROR: Failed to build gem native extension.

    C:/Ruby193/bin/Ruby.exe extconf.rb
creating Makefile


Gem files will remain installed in C:/Ruby193/lib/Ruby/gems/1.9.1/gems/json-1.8.1 for inspection.
Results logged to C:/Ruby193/lib/Ruby/gems/1.9.1/gems/json-1.8.1/ext/json/ext/generator/gem_make.out

これにより、次の2つのことが明らかになります。

  1. Ruby 1.9を使用している場合、「for 1.9」というメッセージが出力されないため、他のdevkit.rbファイルがロードされます。
  2. エラーはどちらの場合も同じであるため、これが実際の問題である可能性は低いです。

生成されたMakefileを使用して手動でビルドできるかどうかを確認します。

20
dannysmith

したがって、これは世界で最良の答えではありませんが、私は解決策を見つけました。詳細フラグを設定すると、すべてが正常に機能します。

gem install json --platform=Ruby --verbose

ここにログがあります: http://Gist.github.com/dannysmith/8055495

これは意味をなさない-なぜこれがエラーを修正したように思われるのか、誰かが説明できたら素晴らしいだろう。おそらくこれはdevkitのバグですか?

11
dannysmith

バージョン1.8.1でgem jsonをインストールしましたが、json 1.6.1でこの問題を解決できませんでした

gem install json --platform=Ruby --verbose

だから、私はここから試しました https://github.com/oneclick/rubyinstaller/issues/184

gem update --system 2.0.3

それとその後

gem install json -v 1.6.1 --platform=Ruby --verbose

Win 7(64ビット)マシン用のjson 1.6.1固有の問題を解決します

7
Swapnil Kotwal

管理者モードでコマンドプロンプトを実行してみてください。 7〜10時間後、私はこれを理解しました...

7
obesechicken13

修正方法:

  1. 最新のRubyインストーラーを https://rubyinstaller.org/downloads/ からダウンロードしました
  2. プロンプトに従って依存関係をインストールし、インストーラーを実行しました。
  3. コンピュータを再起動しました。
  4. Ruby/binディレクトリをPATHに追加しました。
0
Garry Gomez

Windowsに32ビットバージョンをインストールします...

ver
windows 6.1.76011

64ビットで、メイクファイルとヘッダーに関するエラーメッセージが表示されました。 COMSPECとレジストリ、パスへのgccの追加など、rubyinstallerに関する提案を含む他のすべての提案を試しました。一部のgemはインストールされますが、git_fameとjsonはコンパイルする必要がありません。

編集:git_fameがmimer_plusを使用しているようです。 mimer_plusは、GNUツール(UNIXツール)を想定しています。最初にmingwをインストールする必要があるようです。それは、rubyinstallerのページに明確に示されていませんでした。

0
codeslapper

私も同じ問題を抱えていました。パスを確認するためにPowerShellを使用しました

ps> $ s = $ env:path

ps> $ s.split( "{;}")

確かに私のRuby mingwはパスにありませんでした。パスにRuby\binがありましたが、mingw\binは別のフォルダにありました。環境パスに移動して追加しましたそして私のインストールはうまくいきました。

0
EarlLamont

Rubyインストールしたバージョン(32ビットまたは64ビット)がDevKitバージョンと一致していることを確認してください。どちらも32または64である必要があります。これは私が抱えていた問題でした。正確ではない可能性があります。ここに問題がありますが、私はそれをそこに捨てると思いました。

Windowsのレール-インストールの問題

0
Mosab Sasi