如何在Windows 7上使用ruby 1.9.2运行Qt4?

24

概述

我正在编写一个使用Qt4作为GUI的Ruby 1.9.2应用程序,我希望在Linux、OS X和Windows上进行分发。除了我的Windows 7 64位系统外,这个应用程序在其他系统上都可以正常运行。

已经有Win7 + Qt4 + 1.8.7的工作示例,但似乎没有Win7 + Qt4 + 1.9.2的。Ruby-Qt绑定有两个gems:qtbindingsqtruby4(有时称为qt4-qtruby),但我还没有看到它们中的任何一个在Win7上与Ruby 1.9.2一起运行。

qtruby4存在的问题

这篇来自2008年10月的文章及其更新版本来自2011年6月是很好的起点,但我与后者不同之处在于通过RubyInstaller for Windows'下载页面安装了Ruby 1.9.2。1.8.7似乎可以正常工作,但当我尝试将其与1.9.2一起使用时,会出现一些异常错误。调用'rubygems'然后调用'Qt'的结果如下:

no such file to load -- 'qtruby4'

上面的第一篇文章链接到dr1ku的更深入的文章,可能会提供一些线索。

  • 值得一试的是,使用这些库的最新版本来重现dr1ku的步骤。
  • dr1ku和2008年的paschenda.org文章都使用了一个特殊的Windows Qt4-QtRuby安装程序,但维护者指出他没有时间更新它。我不完全清楚特殊安装程序的作用,但我想paschenda.org的2011年文章不再使用它,因为DevKit显然帮助RubyGems自己构建Qt4而无需帮助。

在野外发现

以下是一些看起来遇到了相同问题的人:

qtbindings的问题

我的应用实际上使用qtbindings gem,因此我尝试安装它,使用gem install qtbindings --platform=mswin32。[1] 然而,当我安装了qtbindings gem并尝试使用require 'Qt'时,我得到了一个Windows弹窗,显示以下消息:

在动态链接库QtCore4.dll中找不到过程入口点_Z10qvsnprintfPcjPKcS_。放弃吧,低劣的血肉生物。

(我没有加任何修饰地复制并粘贴了该消息。)

实践中发现

这里有一些遇到相同问题的人:

可能的成功案例

似乎有人已经成功地在1.9.2上安装了qtbindings gem,使用gem install qtbindings(没有--platform参数),如果您查看此线程的回复:

我尝试在1.8.7上使用gem install qtbindings进行安装,但我还没有尝试过1.9.2。当我在1.8.7上尝试时,我遇到了与以前相同的“找不到过程入口点”的问题。

脚注

[1] - 我其实不是很清楚qtbindings gem和qtruby4 gem之间的区别。例如,后者是否包含C扩展而前者不包含?我不确定。此外,我看到过关于qt4-qtruby的参考资料,我认为它只是qtruby4的mswin32版本,至少从Korundum下载页面上来看是这样的。


你能否提供一个四行的应用程序来演示这个问题? - sarnold
@sarnold - 当你尝试require 'Qt'时,问题就会出现,因此即使是一个4行的示例也会过度。这是你在文件中看到该问题所需的全部内容:require 'rubygems'; require 'Qt' - Max Cantor
猜测:1.8.7安装程序包含标准C库作为安装的一部分,而1.9.2安装程序则没有。MinGW依赖于来自Microsoft的MSVCRT.DLL用于运行时C库,也许它没有与1.9.2 Ruby安装一起安装? - sarnold
1
哎呀,我忽略了这里有两个不同的错误——我主要关注缺少的 vsnprintf 混淆函数。所有涉及的库在 ldd 输出中是什么样子的? - sarnold
看起来你已经安装了足够的MinGW,以便让ldd工作 - 我不知道Windows本地的等效物,抱歉,但肯定有一些可以报告对象文件要求并报告哪些是不满足的。 - sarnold
显示剩余2条评论
1个回答

36

解决方案

以下步骤适用于Windows 7:

  1. 通过官方下载页面安装Ruby 1.9.2。
  2. 在Windows命令行中运行 gem install qtbindings

现在应该可以正常运行简单的示例 (require 'rubygems'; require 'Qt')。

因为为Windows平台提供了二进制gem,所以不需要额外的步骤。因此,gem install qtbindings步骤会花费几分钟时间,因为它正在下载大型的二进制文件,但它包含了所有必需的部分来要求和运行Qt应用程序。

在Windows上从源代码编译是受支持的,并在项目的README文件中得到了记录。

详细情况

我给qtbindingsqtruby的维护者发送了电子邮件。以下是完整的故事:

qtruby是由Korundum项目提供的软件包。Korundum为所有的KDE提供Ruby绑定,而qtruby仅提供Qt的绑定。

qtbindings (github) 是经过修改和重新打包的qtruby版本,专门针对跨平台使用进行了优化。我将从其README文件中复制并粘贴 "Goals" 部分:

目标

  1. 通过RubyGems在所有平台上轻松安装Qt绑定
  2. 为Windows维护最新的二进制gem,其中包含所需的所有文件,以便可以在没有任何其他工具的情况下快速安装
  3. 使Ruby的Qt绑定尽可能接近Qt API,并且易于学习和使用
使用来自http://qt.nokia.com的最新版本Qt SDK,以减少维护范围并只绑定到Qt SDK提供的库。同时增加与非Linux平台的兼容性。目前(2011年10月3日),不要在Windows上使用qtruby gem, 可以使用qtbindings代替。如果您只关心Qt而不关心KDE的其余部分,那么qtbindings可能是一个安全选择。QtRuby的维护人员计划在不久的将来进行一些方法论更新(如使用git),因此两个项目之间可能会有更多的共享修复和更新。请注意,Korundum下载页提供了mswin32版本的gem,但截至撰写本文时未经过任何人的认可,因此不应依赖它们。

2
非常好。很抱歉赏金没有吸引其他人来帮助你,但这个总结非常出色:结论、参考文献、支持代码片段和写作都很好。谢谢! - sarnold
1
很棒的文章。谢谢你指出给我看。我在paschenda.org上更新了我的教程,并引用了你的文章。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接