如何在Windows上安装rmagick gem?

如何为Windows XP安装rmagick gem? 我已经使用头文件安装了ImageMagick,并安装了DevKit附带的RailsInstaller.org。 我不知道在哪里修复这些错误。

C:\RailsInstaller\ImageMagick-6.8.2-Q16>ruby -v ruby 1.9.3p125 (2012-02-16) [i386-mingw32] C:\RailsInstaller\ImageMagick-6.8.2-Q16>gem -v 1.8.16 C:\RailsInstaller\ImageMagick-6.8.2-Q16>path=%PATH%;C:\RailsInstaller\ImageMagick-6.8.2-Q16 C:\RailsInstaller\ImageMagick-6.8.2-Q16>identify Version: ImageMagick 6.8.2-0 2013-01-24 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2013 ImageMagick Studio LLC C:\RailsInstaller\ImageMagick-6.8.2-Q16>gem install rmagick Temporarily enhancing PATH to include DevKit... Building native extensions. This could take a while... ERROR: Error installing rmagick: ERROR: Failed to build gem native extension. C:/RailsInstaller/Ruby1.9.3/bin/ruby.exe extconf.rb checking for Ruby version >= 1.8.5... yes Invalid drive specification. Unable to get ImageMagick version *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=C:/RailsInstaller/Ruby1.9.3/bin/ruby Gem files will remain installed in C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rmagick-2.13.1 for inspection. Results logged to C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rmagick-2 .13.1/ext/RMagick/gem_make.out C:\RailsInstaller\ImageMagick-6.8.2-Q16>dir include Volume in drive C has no label. Volume Serial Number is F8E5-EDB8 Directory of C:\RailsInstaller\ImageMagick-6.8.2-Q16\include 01/29/2013 04:33 PM  . 01/29/2013 04:33 PM  .. 01/29/2013 04:33 PM  magick 01/29/2013 04:33 PM  Magick++ 09/05/2009 04:47 PM 419 Magick++.h 01/29/2013 04:33 PM  wand 

这是gem_make.out的内容

 C:/RailsInstaller/Ruby1.9.3/bin/ruby.exe extconf.rb checking for Ruby version >= 1.8.5... yes Invalid drive specification. Unable to get ImageMagick version *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=C:/RailsInstaller/Ruby1.9.3/bin/ruby 

这是extconf.rb的内容

 require "mkmf" require "date" RMAGICK_VERS = "2.13.1" MIN_RUBY_VERS = "1.8.5" MIN_RUBY_VERS_NO = MIN_RUBY_VERS.tr(".","").to_i MIN_IM_VERS = "6.4.9" MIN_IM_VERS_NO = MIN_IM_VERS.tr(".","").to_i # Test for a specific value in an enum type def have_enum_value(enum, value, headers=nil, &b) checking_for "#{enum}.#{value}" do if try_compile(<<"SRC", &b) #{COMMON_HEADERS} #{cpp_include(headers)} /*top*/ int main() { #{enum} t = #{value}; t = t; return 0; } SRC $defs.push(format("-DHAVE_ENUM_%s", value.upcase)) true else false end end end # Test for multiple values of the same enum type def have_enum_values(enum, values, headers=nil, &b) values.each do |value| have_enum_value(enum, value, headers, &b) end end def exit_failure(msg) Logging::message msg message msg+"\n" exit(1) end # Seems like lots of people have multiple versions of ImageMagick installed. def check_multiple_imagemagick_versions() versions = [] path = ENV['PATH'].split(File::PATH_SEPARATOR) path.each do |dir| file = File.join(dir, "Magick-config") if File.executable? file vers = `#{file} --version`.chomp.strip prefix = `#{file} --prefix`.chomp.strip versions < 1 msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n" versions.each do |vers, prefix, dir| msg << " #{dir}/Magick-config reports version #{vers} is installed in #{prefix}\n" end msg << "Using #{versions[0][0]} from #{versions[0][1]}.\n\n" Logging::message msg message msg end end # Ubuntu (maybe other systems) comes with a partial installation of # ImageMagick in the prefix /usr (some libraries, no includes, and no # binaries). This causes problems when /usr/lib is in the path (eg, using # the default Ruby installation). def check_partial_imagemagick_versions() prefix = config_string("prefix") matches = [ prefix+"/lib/lib?agick*", prefix+"/include/ImageMagick", prefix+"/bin/Magick-config", ].map do |file_glob| Dir.glob(file_glob) end matches.delete_if { |arr| arr.empty? } if 0 < matches.length and matches.length < 3 msg = "\nWarning: Found a partial ImageMagick installation. Your operating system likely has some built-in ImageMagick libraries but not all of ImageMagick. This will most likely cause problems at both compile and runtime.\nFound partial installation at: "+prefix+"\n" Logging::message msg message msg end end if RUBY_PLATFORM =~ /mswin/ abort <= #{MIN_RUBY_VERS}") do version = RUBY_VERSION.tr(".","").to_i version >= MIN_RUBY_VERS_NO end exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n" end # Magick-config is not available on Windows if RUBY_PLATFORM !~ /mswin|mingw/ # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments. cc = (ENV["CC"] or Config::CONFIG["CC"] or "gcc").split(' ').first unless find_executable(cc) exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details." end # Check for Magick-config unless find_executable("Magick-config") exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find Magick-config in #{ENV['PATH']}\n" end check_multiple_imagemagick_versions() check_partial_imagemagick_versions() # Ensure minimum ImageMagick version unless checking_for("ImageMagick version >= #{MIN_IM_VERS}") do version = `Magick-config --version`.chomp.tr(".","").to_i version >= MIN_IM_VERS_NO end exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{MIN_IM_VERS} or later.\n" end $magick_version = `Magick-config --version`.chomp # Ensure ImageMagick is not configured for HDRI unless checking_for("HDRI disabled version of ImageMagick") do not (`Magick-config --version`["HDRI"]) end exit_failure "\nCan't install RMagick #{RMAGICK_VERS}."+ "\nRMagick does not work when ImageMagick is configured for High Dynamic Range Images."+ "\nDon't use the --enable-hdri option when configuring ImageMagick.\n" end # Save flags $CFLAGS = ENV["CFLAGS"].to_s + " " + `Magick-config --cflags`.chomp $CPPFLAGS = ENV["CPPFLAGS"].to_s + " " + `Magick-config --cppflags`.chomp $LDFLAGS = ENV["LDFLAGS"].to_s + " " + `Magick-config --ldflags`.chomp $LOCAL_LIBS = ENV["LIBS"].to_s + " " + `Magick-config --libs`.chomp elsif RUBY_PLATFORM =~ /mingw/ # mingw `convert -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-\d+ / abort "Unable to get ImageMagick version" unless $1 $magick_version = $1 $LOCAL_LIBS = '-lCORE_RL_magick_ -lX11' else # mswin `convert -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-\d+ / abort "Unable to get ImageMagick version" unless $1 $magick_version = $1 $CFLAGS = "-W3" $CPPFLAGS = %Q{-I"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include" -I"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\include"} # The /link option is required by the Makefile but causes warnings in the mkmf.log file. $LDFLAGS = %Q{/link /LIBPATH:"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib" /LIBPATH:"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\lib" /LIBPATH:"C:\\ruby\\lib"} $LOCAL_LIBS = 'CORE_RL_magick_.lib X11.lib' end #headers = %w{assert.h ctype.h errno.h float.h limits.h math.h stdarg.h stddef.h stdint.h stdio.h stdlib.h string.h time.h} headers = %w{assert.h ctype.h stdio.h stdlib.h math.h time.h} headers << "stdint.h" if have_header("stdint.h") # defines uint64_t headers << "sys/types.h" if have_header("sys/types.h") if have_header("wand/MagickWand.h") headers << "wand/MagickWand.h" else exit_failure "\nCan't install RMagick #{RMAGICK_VERS}. Can't find MagickWand.h." end if RUBY_PLATFORM !~ /mswin|mingw/ unless have_library("MagickCore", "InitializeMagick", headers) || have_library("Magick", "InitializeMagick", headers) || have_library("Magick++","InitializeMagick",headers) exit_failure "Can't install RMagick #{RMAGICK_VERS}. " + "Can't find the ImageMagick library or one of the dependent libraries. " + "Check the mkmf.log file for more detailed information.\n" end end have_func("snprintf", headers) ["AcquireImage", # 6.4.1 "AffinityImage", # 6.4.3-6 "AffinityImages", # 6.4.3-6 "AutoGammaImageChannel", # 6.5.5-1 "AutoLevelImageChannel", # 6.5.5-1 "BlueShiftImage", # 6.5.4-3 "ConstituteComponentTerminus", # 6.5.7-9 "DeskewImage", # 6.4.2-5 "EncipherImage", # 6.3.8-6 "EqualizeImageChannel", # 6.3.6-9 "FloodfillPaintImage", # 6.3.7 "FunctionImageChannel", # 6.4.8-8 "GetAuthenticIndexQueue", # 6.4.5-6 "GetAuthenticPixels", # 6.4.5-6 "GetImageAlphaChannel", # 6.3.9-2 "GetVirtualPixels", # 6.4.5-6 "LevelImageColors", # 6.4.2 "LevelColorsImageChannel", # 6.5.6-4 "LevelizeImageChannel", # 6.4.2 "LiquidRescaleImage", # 6.3.8-2 "MagickLibAddendum", # 6.5.9-1 "OpaquePaintImageChannel", # 6.3.7-10 "QueueAuthenticPixels", # 6.4.5-6 "RemapImage", # 6.4.4-0 "RemoveImageArtifact", # 6.3.6 "SelectiveBlurImageChannel", # 6.5.0-3 "SetImageAlphaChannel", # 6.3.6-9 "SetImageArtifact", # 6.3.6 "SetMagickMemoryMethods", # 6.4.1 "SparseColorImage", # 6.3.6-? "SyncAuthenticPixels", # 6.4.5-6 "TransparentPaintImage", # 6.3.7-10 "TransparentPaintImageChroma" # 6.4.5-6 ].each do |func| have_func(func, headers) end checking_for("QueryMagickColorname() new signature") do if try_compile(<<"SRC") #{COMMON_HEADERS} #{cpp_include(headers)} /*top*/ int main() { MagickBooleanType okay; Image *image; MagickPixelPacket *color; char *name; ExceptionInfo *exception; okay = QueryMagickColorname(image, color, SVGCompliance, name, exception); return 0; } SRC $defs.push("-DHAVE_NEW_QUERYMAGICKCOLORNAME") true else false end end have_struct_member("Image", "type", headers) # ??? have_struct_member("DrawInfo", "kerning", headers) # 6.4.7-8 have_struct_member("DrawInfo", "interline_spacing", headers) # 6.5.5-8 have_struct_member("DrawInfo", "interword_spacing", headers) # 6.4.8-0 have_type("DitherMethod", headers) # 6.4.2 have_type("MagickFunction", headers) # 6.4.8-8 have_type("ImageLayerMethod", headers) # 6.3.6 replaces MagickLayerMethod have_type("long double", headers) #have_type("unsigned long long", headers) #have_type("uint64_t", headers) #have_type("__int64", headers) #have_type("uintmax_t", headers) #check_sizeof("unsigned long", headers) #check_sizeof("Image *", headers) have_enum_values("AlphaChannelType", ["CopyAlphaChannel", # 6.4.3-7 "BackgroundAlphaChannel"], headers) # 6.5.2-5 have_enum_values("CompositeOperator", ["BlurCompositeOp", # 6.5.3-7 "DistortCompositeOp", # 6.5.3-10 "LinearBurnCompositeOp", # 6.5.4-3 "LinearDodgeCompositeOp", # 6.5.4-3 "MathematicsCompositeOp", # 6.5.4-3 "PegtopLightCompositeOp", # 6.5.4-3 "PinLightCompositeOp", # 6.5.4-3 "VividLightCompositeOp"], headers) # 6.5.4-3 have_enum_values("CompressionType", ["DXT1Compression", # 6.3.9-3 "DXT3Compression", # 6.3.9-3 "DXT5Compression", # 6.3.9-3 "ZipSCompression", # 6.5.5-4 "PizCompression", # 6.5.5-4 "Pxr24Compression", # 6.5.5-4 "B44Compression", # 6.5.5-4 "B44ACompression"], headers) # 6.5.5-4 have_enum_values("DistortImageMethod", ["BarrelDistortion", # 6.4.2-5 "BarrelInverseDistortion", # 6.4.3-8 "BilinearForwardDistortion", # 6.5.1-2 "BilinearReverseDistortion", # 6.5.1-2 "DePolarDistortion", # 6.4.2-6 "PolarDistortion", # 6.4.2-6 "PolynomialDistortion", # 6.4.2-4 "ShepardsDistortion"], headers) # 6.4.2-4 have_enum_value("DitherMethod", "NoDitherMethod", headers) # 6.4.3 have_enum_values("FilterTypes", ["KaiserFilter", # 6.3.6 "WelshFilter", # 6.3.6-4 "ParzenFilter", # 6.3.6-4 "LagrangeFilter", # 6.3.7-2 "BohmanFilter", # 6.3.7-2 "BartlettFilter", # 6.3.7-2 "SentinelFilter"], headers) # 6.3.7-2 have_enum_values("MagickEvaluateOperator", ["PowEvaluateOperator", # 6.4.1-9 "LogEvaluateOperator", # 6.4.2 "ThresholdEvaluateOperator", # 6.4.3 "ThresholdBlackEvaluateOperator", # 6.4.3 "ThresholdWhiteEvaluateOperator", # 6.4.3 "GaussianNoiseEvaluateOperator", # 6.4.3 "ImpulseNoiseEvaluateOperator", # 6.4.3 "LaplacianNoiseEvaluateOperator", # 6.4.3 "MultiplicativeNoiseEvaluateOperator", # 6.4.3 "PoissonNoiseEvaluateOperator", # 6.4.3 "UniformNoiseEvaluateOperator", # 6.4.3 "CosineEvaluateOperator", # 6.4.8-5 "SineEvaluateOperator", # 6.4.8-5 "AddModulusEvaluateOperator"], # 6.4.8-5 headers) have_enum_values("MagickFunction", ["ArcsinFunction", # 6.5.2-8 "ArctanFunction", # 6.5.2-8 "PolynomialFunction", # 6.4.8-8 "SinusoidFunction"], headers) # 6.4.8-8 have_enum_values("ImageLayerMethod", ["FlattenLayer", # 6.3.6-2 "MergeLayer", # 6.3.6 "MosaicLayer", # 6.3.6-2 "TrimBoundsLayer" ], headers) # 6.4.3-8 have_enum_values("VirtualPixelMethod", ["HorizontalTileVirtualPixelMethod", # 6.4.2-6 "VerticalTileVirtualPixelMethod", # 6.4.2-6 "HorizontalTileEdgeVirtualPixelMethod", # 6.5.0-1 "VerticalTileEdgeVirtualPixelMethod", # 6.5.0-1 "CheckerTileVirtualPixelMethod"], # 6.5.0-1 headers) # Now test Ruby 1.9.0 features. headers = ["ruby.h"] if have_header("ruby/io.h") headers << "ruby/io.h" else headers << "rubyio.h" end have_func("rb_frame_this_func", headers) # Miscellaneous constants $defs.push("-DRUBY_VERSION_STRING=\"ruby #{RUBY_VERSION}\"") $defs.push("-DRMAGICK_VERSION_STRING=\"RMagick #{RMAGICK_VERS}\"") create_header() # Prior to 1.8.5 mkmf duplicated the symbols on the command line and in the # extconf.h header. Suppress that behavior by removing the symbol array. $defs = [] # Force re-compilation if the generated Makefile changed. $config_h = "Makefile rmagick.h" create_makefile("RMagick2") SUMMARY = <<"END_SUMMARY" #{"=" * 70} #{DateTime.now.strftime("%a %d%b%y %T")} This installation of RMagick #{RMAGICK_VERS} is configured for Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{$magick_version} #{"=" * 70} END_SUMMARY Logging::message SUMMARY message SUMMARY 

这是mkmf.log的内容

 checking for Ruby version >= 1.8.5... -------------------- yes -------------------- 

我也有Cygwin并尝试过,但遇到了不同的ruby相关错误。 我可以看到一些错误,比如“无效的驱动器规范”,但我不知道它来自何处。

RMagic不适用于ImageMagic 6.8。 我更新了RMagick Github wiki并附有详细说明。

https://github.com/rmagick/rmagick/wiki

在那里我发现了gem(哈哈)等

如果ImageMagick不是系统路径中的第一个,当extconf.rb尝试识别ImageMagick版本时,您将收到“无效的驱动器规范”错误。

 gem install rmagick -- '--with-opt-dir="[path to ImageMagick]"' 

(很明显,是吧?)

我相信RMagick是一个死的项目。 2年没有提交!

你应该使用rmagick-win32:

http://rmagick.rubyforge.org/install-faq.html#win

尝试这个video,它通过窗口7的安装过程。我按照步骤,它为我工作。

http://www.youtube.com/watch?v=gEWAVlNCKhg&feature=youtu.be

在管理员模式下启动命令提示符。 设置CPATH和LIBRARY_PATH环境变量分别指向ImageMagick安装目录include和lib子目录(因此DevKit将在构建时找到它们)

设置CPATH = C:\ Program Files(x86)\ ImageMagick-6.7.9-Q16 \ include set LIBRARY_PATH = C:\ Program Files(x86)\ ImageMagick-6.7.9-Q16 \ lib

然后启动一个新的命令提示符

gem安装rmagick

这对我有用! 请参阅http://www.redmine.org/projects/redmine/wiki/HowTo_install_rmagick_gem_on_Windows中的结果