构建XPCOM XULRunner 2.0或更新版本

时间:2012-01-04 10:04:10

标签: c++ mozilla xpcom xulrunner gecko

跟进以下问题:

What lib in the gecko 1.9.3 SDK do I link against to use moz_xmalloc()?

nsIGenericFactory.h is missing in the above version of xulrunner-2.0.en-US.win32.sdk

我能够成功地使用XULRunner 1.9.2构建XPCOM。

当我尝试迁移到XULRunner的下一个版本(> 1.9)时,我遇到了很多困难。我收到链接错误,如下所示

xpcomglue_s.lib(GenericFactory.obj) : error LNK2001: unresolved external symbol __imp__moz_xmalloc
xpcomglue_s.lib(nsCRTGlue.obj) : error LNK2001: unresolved external symbol __imp__moz_xmalloc
xpcomglue_s.lib(nsTArray.obj) : error LNK2001: unresolved external symbol __imp__moz_xmalloc
xpcomglue_s.lib(nsComponentManagerUtils.obj) : error LNK2001: unresolved external symbol __imp__moz_xmalloc
xpcomglue_s.lib(GenericModule.obj) : error LNK2001: unresolved external symbol __imp__moz_xmalloc
xpcomglue_s.lib(nsISupportsImpl.obj) : error LNK2001: unresolved external symbol __imp__moz_xmalloc

我没有明确的迁移步骤来支持当前的FireFox。

我尝试了链接中提到的建议。我无法解决它。请帮我解决这个问题

2 个答案:

答案 0 :(得分:4)

我希望有人会提供一份完整的清单,列出应该更改的内容,以便让它在以后的壁虎上工作,但由于没有人这样做,我会尝试自己做,使用this示例我只是找到。

xpidl.exe

我不知道这是否有所改变,所以这可能没有必要。 Gecko 11中没有xpidl.exe。 Philip Chee

的解决方案
  

它已被Python脚本取代。你可以继续使用   来自Gecko 7.0 SDK的XPIDL,或者从源代码编译它,或者使用   Python脚本。

Gecko 7.0可以从ftp HERE下载。它真的有xpidl.exe。用法与example

中的用法相同

组件模块实现

这个似乎改变了很多。 Reference in MDNanother reference(返回顶部提供的示例,但解释了内容)。

  

请注意,nsIGenericFactory.h已被删除。参考   nsIGnericFactory.h应替换为mozilla / ModuleUtils.h

在示例项目#include "nsIClassInfoImpl.h"中也添加了。

现在最重要的一步是更改NS_IMPL_NSGETMODULE(也被删除)和components的声明,components的声明用于kSampleCategories中发现的一大堆内容。 3}}。您可以使用NULL的声明作为参考,我做了,有点帮助。

该样本中唯一不需要的是kNS_SAMPLE_CID的声明和用法。只需将其替换为kYOUR_CID_CONSTANT即可。至少那是 Benjamin Smedberg sample module

常量NS_IMPL_MOZILLA192_NSGETMODULE(&kSampleModule) 应替换为NS_IMPL_CLASSINFO...。只需将k添加到您的CID常量名称。

最后一行:

NS_IMPL_ISUPPORTS1
只有与Gecko 1.9兼容才需要

。因为firefox 3.5使用它,我想我会离开它。

组件实现(CompImpl.cpp)

来自said的参考。

  • 添加NS_IMPL_ISUPPORTS1_CI行(在示例中为第80行)
  • __imp__moz_xmalloc替换为{{1}}

在这个示例中,有很多关于如何使用输入/输出值的好例子。如果要使用char *,还需要使用nsMemory。我认为对于nsStrings来说这不是必需的。

sample

我们再次向{{1}}发送一系列链接错误。这篇文章很难找到,很有助于摆脱它们:

  

从XULRunner 2.0开始,冻结的连锁依赖胶水   (Windows上为xpcomglue_s.lib,Linux和Mac上为libxpcomglue_s.a)   依赖于新的无法确定的内存分配例程(mozalloc)。   由于这些例程在XULRunner 2.0,XPCOM之前不存在   链接冻结链接依赖胶水的组件将   与2.0之前的XULRunner应用程序不兼容。

     

解决方案是链接xpcomglue_s_nomozalloc   (Windows上的xpcomglue_s_nomozalloc.lib,libxpcomglue_s_nomozalloc.a on   Linux和Mac)。这个库是XULRunner 2.0中的新增功能   与xpcomglue_s相同,除了它是在没有mozalloc的情况下编译的。   只需在编译器中更改对“xpcomglue_s”的所有引用即可   链接器标志为“xpcomglue_s_nomozalloc”。产生的XPCOM组件   将不再依赖mozalloc,因此将是   与2.0之前的XULRunner应用程序兼容。

     

评论:您可能还需要使用   MOZ_NO_MOZALLOC标志(-DMOZ_NO_MOZALLOC)

最后,没有错误

答案 1 :(得分:1)

This seems to be a common problem.我看到你已经找到了这个帖子并尝试了标准建议,但为了其他人的利益:

  

在C ++预处理器定义属性中定义'XPCOM_GLUE'。它会   修复链接错误。

由于你已经有了这个,你应该尝试的下一个修复实际上是在页面的下方:

  

在编译扩展程序时尝试定义MOZ_NO_MOZALLOC,您将会这样做   然后得到一个使用CRT分配器的DLL。 (别忘了使用   the NS_* allocators for XPCOM-compatible memory。)

您可以通过在扩展程序的内容中添加#define MOZ_NO_MOZALLOC,在构建XULRunner时添加configure,或在mozilla-config.h等单个文件的内容中添加

虽然你已经非常有可能尝试过这个,但应该解决你的链接器问题,至少。

修改:为了赏金提供者的利益,here's advice to resolve the __cdecl NS_NewGenericModule2 issue.