【问题标题】:How to Compile a Ruby C Extension and link libcurl on Windows如何在 Windows 上编译 Ruby C 扩展并链接 libcurl
【发布时间】:2012-07-13 21:23:21
【问题描述】:

我正在尝试构建一个使用 libcurl 的 Ruby C 扩展。到目前为止,我已经在 Os X 上成功构建了它。但是我在 Windows 中开发的经验要少得多,并且不完全确定如何去做。

到目前为止,我可以按照这些说明或多或少地使用 Visual Studio 命令提示符中的 extconf.rb 和 nmake 编译 Ruby C 扩展

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

但是我的扩展链接 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 放在哪里,以便我的编译器可以找到它们。

【问题讨论】:

  • Robin,你下载了哪个libcurl版本?我尝试了几个版本,只能使用 7.21.1 运行。无论出于何种原因,7.25.x 对我都不起作用。
  • 我使用 Luis 提供的链接中的 7.24.0-x86。 packages.openknapsack.org/libcurl/…

标签: c ruby windows nmake ruby-c-extension


【解决方案1】:

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

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

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

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

您可以在RubyInstaller downloads page找到所有这些以及安装说明

安装 Ruby 和 DevKit 后,您可以编译大部分不依赖外部库的扩展。

现在,在您的特定情况下,libcurl、RubyInstaller 提供了一些预编译的二进制文件,可以完美地安装基于 curl 的工具。

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

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

比如要安装curb gem,在我解压我刚刚做的包之后:

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

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

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

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

希望这会有所帮助。如果您对在 Windows 上安装和使用 Ruby 有任何疑问,请加入RubyInstaller group

【讨论】:

  • 感谢您的详细回答。我按照您的指示进行操作。从 RubyInstaller 安装 Ruby,安装 DevKit 并从您发送给我的链接中提取所需的二进制文件。将带有二进制文件的目录添加到我的 PATH 中,然后我尝试使用您提供的命令安装遏制(带有我的二进制文件位置的路径)我还尝试仅下载 curl-mingw32(提取到 c:\curl),并安装遏制使用此命令 gem install cream -- --with-curl-lib=C:\curl\bin --with-curl-include=C:\curl\include 在这两种情况下我仍然得到 extconf.rb:18: Can'找不到 libcurl 或 curl/curl.h
  • @Robin 你不需要 curl 二进制文件来安装或使用 libcurl。您在C:\curl 中提取了 libcurl?如果是这样,整个编译输出是什么? (来自gem install 以及在 gem 目录中找到的mkmf.log 的内容是什么?请加入 RubyInstaller 列表以获得进一步的帮助。一旦我们弄清楚发生了什么,就会更新答案。
  • 对于遇到同样问题的 Ubuntu 用户,尝试安装最新版本的 gcc 和 make,应该没问题。
  • @user3613932 的评论完美运行,安装了sudo apt install build-essential
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多