如何在Windows上编译Ruby C扩展和链接libcurl



我正在尝试构建一个使用libcurl的Ruby C扩展。到目前为止,我已经在OSX上成功地构建了它。然而,我在Windows中开发的经验要少得多,也不太确定如何做到这一点。

到目前为止,我可以使用extconf.rb和nmake从Visual Studio命令提示符编译Ruby C扩展,大致可以按照以下说明进行

http://blogs.law.harvard.edu/hoanga/2006/12/14/getting-a-ruby-c-extension-to-compile-on-windows/

然而,我的Extension链接了libcurl,在extconf.rb中有一行可以检查这个

# Make sure the cURL library is installed.
have_library("curl")

创建makefile时,我得到

checking for main() in curl.lib... no
creating Makefile

当运行nmake时,我得到

fatal error C1083: Cannot open include file: 'curl/curl.h': No such file or directory

这都是意料之中的事,因为它还没有安装。我已经下载了curl-7.26.0-devel-mingw64(我认为这适用于Windows 7)

我只是不知道在Windows环境中我应该把/bin或/include放在哪里,这样我的编译器就可以找到它们。

在Windows上,您可以使用不同的编译器,包括Microsoft提供的Visual Studio、MinGW项目的GCC或英特尔编译器。

RubyInstaller(我认为它是您正在使用的Ruby版本)使用GCC(这就是它生成名称中带有mingw的文件的原因)

由于Ruby的工作方式,您不能混合和匹配编译器。如果Ruby是用GCC构建的,那么需要GCC进行编译。

现在推荐的方法是:RubyInstaller+DevKit。DevKit是一个方便的包,它提供了编译Ruby C扩展所需的所有工具。

您可以在RubyInstaller下载页面上找到所有这些以及安装说明

一旦安装了Ruby和DevKit,就可以编译大多数不依赖外部库的扩展。

现在,在您的特定情况下,libcurl、RubyInstaller提供了一些预编译的二进制文件,这些二进制文件非常适合安装基于curl的工具。

libcurl包与其他包一起在RubyInstaller组中发布。

您需要下载x86windows软件包(组页面中的链接),有关如何提取和放置的说明可以在同一链接中找到。请注意,libcurl还需要c-ares、zlib和openssl包。

例如,为了安装路缘宝石,在我提取了我刚刚做的包之后:

gem install curb -- --with-curl-dir=C:/Knapsack/x86-windows

其中C:/Knapsack/x86-windows是我提取了之前提到的所有二进制包的目录。我还在PATH中添加了bin目录,这样就可以找到并使用libcurl DLL。

请注意,虽然Windows使用来指定目录分隔符,但在为RubyGems提供选项时需要使用/

注意2:在你的文章中,你提到了下载的mingw64,它很可能是64位二进制文件。Ruby是一个32位的可执行文件,所以我推荐的包是32位(x86)。目前,RubyInstaller不提供64位(x64)二进制文件。

希望这能有所帮助。如果您对在Windows上安装和使用Ruby有进一步的问题,请加入RubyInstaller小组

最新更新