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

时间:2012-09-17 18:59:23

标签: 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扩展名?如果您需要更多信息,请联系我们。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我在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