ruby - 编译 Ruby C 扩展时如何静态链接外部库

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

我正在 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 扩展吗?我们将不胜感激,如果您需要更多信息,请告诉我。

最佳答案

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

尝试将以下内容添加到您的 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

关于ruby - 编译 Ruby C 扩展时如何静态链接外部库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12465514/

相关文章:

linux - linux下gcc使用静态库的方法

c - Visual Studio 不一致地生成 .lib

ruby-on-rails - Rails : request. remote_id 返回六位数字

c++ - 您如何直接从 Windows 上的物理内存中读取?

c - 如何编译c程序使其不依赖于任何库?

windows - WDK 10 - 无法以安装了 SDK7 的 Windows 7 为目标

python - 如何以编程方式检索 Microsoft 的 Inspect.exe 中 "name"字段的等效项?

ruby-on-rails - 我们如何定义大整数?

ruby - 后台/守护进程

ruby - 使用 GAE 和 Ruby 发送电子邮件