【问题标题】:How to Statically Link External Libraries when Compiling a Ruby C Extension编译 Ruby C 扩展时如何静态链接外部库
【发布时间】:2012-09-17 18:59:23
【问题描述】:

我正在 Windows 上构建一个 Ruby C 扩展,它需要一些外部 C 库,特别是 libcurl 及其依赖项。我有 curllib dll 和 .a 文件。但是,当我使用 extconf.rb 构建时,它总是动态链接库,这需要有人安装 curl 并在他们的 Windows 路径中使用已编译的扩展。相反,我希望 extconf.rb 静态链接 curl 及其依赖项,以便任何人都可以在 windows 上使用扩展,而无需先将 curllib 添加到他们的路径中。

这是我的 extconf.rb

require 'mkmf'

# Name the extension.
extension_name = 'ConnectionManager'
dir_config("curl")

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

# Create the Makefile.
create_makefile(extension_name)

这是我生成makefile的命令

ruby extconf.rb --with-curl-dir=C:/Knapsack/x86-windows

我可以在我的 extconf.rb 文件或命令中添加一些东西来强制 ruby​​ 将外部库静态链接到我的 c 扩展吗?任何帮助将不胜感激,如果您需要更多信息,请告诉我。

【问题讨论】:

  • 我实际上正在尝试将 CURL 自己与 Ruby C 扩展链接。有兴趣听听你是怎么上去的。如果您愿意分享一些链接 CURL 的经验,请通过我在答案中发布的 Bitbucket 链接找到我。

标签: ruby windows static-linking ruby-c-extension extconf.rb


【解决方案1】:

我在 linux 上使用 gif_lib 编写本机扩展时遇到了类似的问题。

尝试将以下内容添加到您的 extconf.rb:

unless find_library("curl", "curl_version")
  abort "curl is not installed, please install and try again"
end

如果库和入口点存在,find_library 函数返回 true,并且具有将其添加到 gcc 的 -l 选项的副作用。

我发现这些链接很有用: http://tenderlovemaking.com/2010/12/11/writing-ruby-c-extensions-part-2.html

这是 C 扩展(一个工作示例): https://github.com/e-g-r-ellis/ruby-giflib

【讨论】:

    【解决方案2】:

    当我使用 Visual Studio Express 中的 nmake 构建我的 Ruby C 扩展时,我必须将编译器标志从 -MD 更改为 -MT 以避免依赖于 MSVCRT。

    我在extconf.rb 文件中设置了$CFLAGS 变量。 $CFLAGS = '-MT -Ot -Ox -W4' 不确定是否是修改这些标志的正确方法,但它有效。

    https://bitbucket.org/thomthom/sketchup-ruby-c-extension/commits/3e87351be87f177b8ed43798587f6e798064492d

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多