【问题标题】:Building XPCOM XULRunner 2.0 or newer versions构建 XPCOM XULRunner 2.0 或更新版本
【发布时间】:2012-01-04 10:04:09
【问题描述】:

跟进以下问题:

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。

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

【问题讨论】:

  • 更多警告:错误 LNK2019:未解析的外部符号“unsigned int __cdecl NS_NewGenericModule2(struct nsModuleInfo const *,class nsIModule * *)”在函数 _NSGetModule comp-module.obj 中引用

标签: c++ mozilla xpcom xulrunner gecko


【解决方案1】:

我希望有人能提供一份完整的清单,列出应该更改哪些内容以使其在以后的 gecko 上运行,但由于没有人这样做,我会尝试自己做,使用我刚刚找到的 this 示例。

xpidl.exe

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

的解决方案

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

Gecko 7.0 可以从 ftp HERE 下载。它确实有 xpidl.exe。用法和example中的一样

组件模块实现

这个好像变了很多。 Reference in MDNanother reference(返回到顶部提供的示例,但解释了一些内容)。

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

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

现在最大的一步是更改NS_IMPL_NSGETMODULE(也被删除)和components 的声明,它被用于sample module 中的所有内容。您可以使用components 的声明作为参考,我这样做了,有点帮助。

该示例中唯一不需要的是kSampleCategories 的声明和使用。只需将其替换为NULL。至少 Benjamin Smedberg said 是这样的。

常量kNS_SAMPLE_CID 应替换为kYOUR_CID_CONSTANT。只需在您的 CID 常量名称前面加上 k。

最后一行:

NS_IMPL_MOZILLA192_NSGETMODULE(&kSampleModule)

仅用于与 Gecko 1.9 兼容。由于 Firefox 3.5 使用它,我想我会离开它。

组件实现(CompImpl.cpp)

来自sample的参考。

  • 添加 NS_IMPL_CLASSINFO... 行(在示例中为第 80 行)
  • NS_IMPL_ISUPPORTS1 替换为NS_IMPL_ISUPPORTS1_CI

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

XPCOM Glue without mozalloc

我们又来了,一堆指向__imp__moz_xmalloc 的链接错误。这篇很难找到的小文章帮助我们摆脱了它们:

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

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

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

最后,没有错误

【讨论】:

    【解决方案2】:

    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.

    【讨论】:

    • 实际上我没有做“尝试定义MOZ_NO_MOZALLOC ...”部分,因为我没有真正理解它,主要是括号中的部分,如果你能写我将非常感激更详细地介绍
    • @SinistraD 添加了一个额外的句子,详细说明了如何执行此操作。
    • 我的意思是“不要忘记使用 NS_* 分配器”部分(括号中的那个)。顺便说一句,这些定义都没有使警告消失
    • @SinistraD 我相信this reference is what's being referred to。发帖人指出要确保您在 API 参考中使用 NS_* 内存调用,以确保 XPCOM 管理底层的 mallocfree。这是有道理的,因为您刚刚关闭了mozalloc.h 中的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多