title: How to install rmagick gem on Windows?
body: <p>How do I install rmagick gem for Windows XP? I already installed ImageMagick with the header files, and I installed RailsInstaller.org which comes with DevKit. I don't know where to look to fix these errors.</p>
  
  <pre><code>C:\RailsInstaller\ImageMagick-6.8.2-Q16&gt;ruby -v
  ruby 1.9.3p125 (2012-02-16) [i386-mingw32]
  
  C:\RailsInstaller\ImageMagick-6.8.2-Q16&gt;gem -v
  1.8.16
  
  C:\RailsInstaller\ImageMagick-6.8.2-Q16&gt;path=%PATH%;C:\RailsInstaller\ImageMagick-6.8.2-Q16
  
  C:\RailsInstaller\ImageMagick-6.8.2-Q16&gt;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&gt;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 &gt;= 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&gt;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    &lt;DIR&gt;          .
  01/29/2013  04:33 PM    &lt;DIR&gt;          ..
  01/29/2013  04:33 PM    &lt;DIR&gt;          magick
  01/29/2013  04:33 PM    &lt;DIR&gt;          Magick++
  09/05/2009  04:47 PM               419 Magick++.h
  01/29/2013  04:33 PM    &lt;DIR&gt;          wand
  </code></pre>
  
  <p>Here is the contents of gem_make.out</p>
  
  <pre><code>C:/RailsInstaller/Ruby1.9.3/bin/ruby.exe extconf.rb
  checking for Ruby version &gt;= 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
  </code></pre>
  
  <p>Here is the contents of extconf.rb</p>
  
  <pre><code>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, &amp;b)
    checking_for "#{enum}.#{value}" do
      if try_compile(&lt;&lt;"SRC", &amp;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, &amp;b)
    values.each do |value|
      have_enum_value(enum, value, headers, &amp;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 &lt;&lt; [vers, prefix, dir]
        end
     end
     versions.uniq!
     if versions.size &gt; 1
        msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n"
        versions.each do |vers, prefix, dir|
           msg &lt;&lt; "         #{dir}/Magick-config reports version #{vers} is installed in #{prefix}\n"
        end
        msg &lt;&lt; "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 (e.g., 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 &lt; matches.length and matches.length &lt; 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 &lt;&lt;END_MSWIN
  +----------------------------------------------------------------------------+
  | This rmagick gem is for use only on Linux, BSD, OS X, and similar systems  |
  | that have a gnu or similar toolchain installed. The rmagick-win32 gem is a |
  | pre-compiled version of RMagick bundled with ImageMagick for use on        |
  | Microsoft Windows systems. The rmagick-win32 gem is available on RubyForge.|
  | See http://rmagick.rubyforge.org/install-faq.html for more information.    |
  +----------------------------------------------------------------------------+
  END_MSWIN
  end
  
  
  
  
  unless checking_for("Ruby version &gt;= #{MIN_RUBY_VERS}") do
    version = RUBY_VERSION.tr(".","").to_i
    version &gt;= 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 &gt;= #{MIN_IM_VERS}")  do
      version = `Magick-config --version`.chomp.tr(".","").to_i
      version &gt;= 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 &lt;&lt; "stdint.h" if have_header("stdint.h")  # defines uint64_t
  headers &lt;&lt; "sys/types.h" if have_header("sys/types.h")
  
  
  if have_header("wand/MagickWand.h")
     headers &lt;&lt; "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(&lt;&lt;"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 &lt;&lt; "ruby/io.h"
  else
     headers &lt;&lt; "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 = &lt;&lt;"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
  </code></pre>
  
  <p>This is the contents of mkmf.log</p>
  
  <pre><code>checking for Ruby version &gt;= 1.8.5... -------------------- yes
  
  --------------------
  </code></pre>
  
  <p>I also have Cygwin and tried there, but encountered a different ruby related error. I can see a few errors, like 'Invalid drive specification', but I don't know where that is coming from. </p>