2

我构建了一个 Ruby gem,它需要一些 C 扩展。这个 - 一旦编译 - 通过 Ruby FFI 绑定到 gem 中。

我的设置:我使用 bundle 作为 gem 脚手架。在我的 gems 文件夹中,我有一个子文件夹ext。这包括一个静态 Makefile、另一个子文件夹source和一个 extconf.rb。

source文件夹包含所有 .c 和 .h 文件。

Makefile 不必动态创建。如果我调用所有编译make clean && makeext并且 gem 按预期工作。

现在我给 extconf.rb 以下内容:

require 'mkmf'
require 'fileutils'

# Give it a name
extension_name = 'somename'

# The destination
dir_config extension_name

# Do the work
create_makefile extension_name

# Overwrite Makefile
FileUtils.cp 'Makefile.template', 'Makefile'

所以我让 mkmf 先创建一个 Makefile,然后用我的静态模板覆盖它。愚蠢的。

当我现在通过构建我的 gemrake build并尝试在另一台机器上安装它时,扩展名没有被编译。

谁能告诉我,为了让扩展在安装时自动编译,我必须做什么?

4

1 回答 1

6

感谢 Neil Slater 的提示,解决方案很简单:我的 gemspec 文件中没有 gem.extension ,如下所示:

s.extensions    = %w[ext/extconf.rb]

对于任何面临同样问题的人。

于 2013-09-12T13:36:36.410 回答