跟进以下问题:
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。
我尝试了链接中提到的建议。我无法解决它。请帮我解决这个问题
答案 0 :(得分:4)
我希望有人会提供一份完整的清单,列出应该更改的内容,以便让它在以后的壁虎上工作,但由于没有人这样做,我会尝试自己做,使用this示例我只是找到。
我不知道这是否有所改变,所以这可能没有必要。 Gecko 11中没有xpidl.exe。 Philip Chee
的解决方案它已被Python脚本取代。你可以继续使用 来自Gecko 7.0 SDK的XPIDL,或者从源代码编译它,或者使用 Python脚本。
Gecko 7.0可以从ftp HERE下载。它真的有xpidl.exe。用法与example
中的用法相同这个似乎改变了很多。 Reference in MDN和another 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使用它,我想我会离开它。
来自said的参考。
NS_IMPL_ISUPPORTS1_CI
行(在示例中为第80行)__imp__moz_xmalloc
替换为{{1}} 在这个示例中,有很多关于如何使用输入/输出值的好例子。如果要使用char *,还需要使用nsMemory。我认为对于nsStrings来说这不是必需的。
我们再次向{{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
等单个文件的内容中添加1}。
虽然你已经非常有可能尝试过这个,但应该解决你的链接器问题,至少。
修改:为了赏金提供者的利益,here's advice to resolve the __cdecl NS_NewGenericModule2
issue.