我目前正在尝试安装一些 Ruby Gem,这些 Ruby Gem 需要在 Windows 10 上正确安装和链接 fftw3 库。这是Linux上的单行修复,所以我在这一点上相当恼火。
- fftw3 ~> 0.3
- 卷积器 ~> 0.3.1
我安装了 Ruby 2.2.4(64 位(并安装了 64 位 Devkit。
运行gem install fftw3
会产生以下结果:
Temporarily enhancing PATH to include DevKit...
Building native extensions. This could take a while...
ERROR: Error installing fftw3:
ERROR: Failed to build gem native extension.
current directory: C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/fftw3-0.3/ext
C:/Ruby22-x64/bin/ruby.exe -r ./siteconf20180813-7456-1v4icuv.rb extconf.rb
checking for narray.h... yes
checking for narray_config.h... yes
checking for fftw3.h... yes
checking for main() in -lfftw3... no
*** 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:/Ruby22-x64/bin/$(RUBY_BASE_NAME)
--with-narray-dir
--without-narray-dir
--with-narray-include
--without-narray-include=${narray-dir}/include
--with-narray-lib
--without-narray-lib=${narray-dir}/lib
--with-fftw3-dir
--without-fftw3-dir
--with-fftw3-include
--without-fftw3-include=${fftw3-dir}/include
--with-fftw3-lib
--without-fftw3-lib=${fftw3-dir}/lib
--with-fftw3lib
--without-fftw3lib
** configure error **
Header fftw3.h or the compiled fftw3 library is not found.
If you have the library installed under /fftw3dir (that is, fftw3.h is
in /fftw3dir/include and the library in /fftw3dir/lib/),
try the following:
% ruby extconf.rb --with-fftw3-dir=/fftw3dir
Alternatively, you can specify the two directory separately
with --with-fftw3-include and --with-fftw3-lib.
To see why this extension failed to compile, please check the mkmf.log which
can be found here:
C:/Ruby22-x64/lib/ruby/gems/2.2.0/extensions/x64-mingw32/2.2.0/fftw3-0.3/mkmf.log
extconf failed, exit code 1
Gem files will remain installed in C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/fftw3-0.3 for inspection.
Results logged to C:/Ruby22-x64/lib/ruby/gems/2.2.0/extensions/x64-mingw32/2.2.0/fftw3-0.3/gem_make.out
这里有很多...到目前为止,我已经能够通过读取 mkmf.log 文件并将标头放置在 gem 安装搜索的路径中来正确链接 fftw3.h 文件。我尝试使用更多的命令行选项ruby extconf.rb <opts>
生成生成文件(收到类似的错误(,我将 DLL 放在 System32 和 SysWOW64 文件夹中。
同样的错误填充了 ruby-termios 宝石,但它正在寻找 termios.h。这让我相信需要安装 Devkit 的宝石可能有问题,所以我尝试重新安装它也没有运气。
所以我有几个问题:
为什么 Devkit gem 会搜索与要安装的 gem 匹配的头文件?(例如,fftw3 查找 fftw3.h,Ruby-termios 查找 termios.h(这些不应该与宝石捆绑在一起吗?
libfftw3 是否有可能缺少 main(( 函数?我不确定安装命令是否可以找到 dll,或者 dll 是否缺少 main((。如果是这种情况,这个问题的解决方法是什么?(我不想从extconf.rb文件中删除have_library("fftw3"(调用,因为这感觉很脏而且到处都是不正确的。
有谁知道此错误的解决方法?
很抱歉向你扔了这么多,希望这已经足够清楚了。 提前谢谢。
编辑:需要注意的几件事:
- 在Windows上,你可以在Cygwin的安装过程中安装fftw3库。
gem install
还有一个安装 --with-fftw3-dir="path">
的选项
按顺序回答您的问题:
- (这实际上是几个问题(通常是的,命名约定当然会传达一些有意义的东西,但这不是必需的。作者很有可能更改了文件的名称。Ruby 只是寻找一个必须
Init_gem_name
定义的入口点。除此之外,只要它符合 C 标准并且extconfig.rb
被正确配置为告诉编译器在哪里可以找到源文件,任何事情都可以。任何 C 扩展都将至少有一个标头来定义入口点,但根据 gem 的作用,可能不包含标头。例如,如果编写使用 OpenGL 的 gem,则并不总是需要包含gl.h
标头,因为它默认已包含在 Windows、OSX 和 Linux 系统中(尽管通常已过时(。 - 这不太可能,我只想说不。
- 您不需要"变通方法",只需按照给出的说明使用 Gem。并非所有 gem 都是没有依赖项的独立库,尤其是包装库的任何内容。这个特定的 gem 要求在安装 gem 之前已经在您的系统上安装
libfft3
可以找到它的位置,否则它认为通过读取头文件而具有的所有功能实际上不会在任何地方定义。
这些步骤适用于Windows 10上带有Ruby 2.2.4和Devkit的64位操作系统。
-
运行 Cygwin 安装程序并选择 mingw64-x86_64-fftw3(版本 3.3.5(进行安装
-
C:cygwin64usrx86_64-w64-mingw32sys-rootmingwliblibfftw3*
复制到C:fftw3lib
-
C:cygwin64usrx86_64-w64-mingw32sys-rootmingwincludefftw3*
复制到C:fftw3include
-
复制
C:COSMOSVendorRubylibrubygems2.2.0gemsnarray-0.6.1.2srclibnarray.a
到C:fftw3lib
-
将
narray.h
和narray_config.h
从<rubypath>librubygems2.2.0gemsnarray-0.6.1.2src
复制到C:fftw3include
-
运行
gem install fftw3 -- --with-opt-dir=C:fftw3
-
将
C:cygwin64usrx86_64-w64-mingw32sys-rootmingwbin
添加到路径
这些步骤将允许安装需要fftw3
库的 Gem。您只需要在gem install
期间指定--with-opt-dir
选项