我在Windows上构建了SpiderMonkey。他们提供MSVC ++工具链,我无法为mingw构建它。我已经为64位构建了它。
这是一个DLL,我需要将其lib转换为gnu C ++格式(.lib到.a)。 在网上看到之后,我在这里找到了如何做到这一点,粗略地说:
gendef mozjs-45.dll
dlltool --as-flags=--64 -m i386:x86-64 -k --output-lib mozjs-45.a --input-def mozjs-45.def
我在Code :: Blocks下使用TDM-GCC-64。在链接时,它会抛出错误,如:
undefined reference to `__imp__Z13JS_GetPrivateP8JSObject'
我使用以下方法检查了lib内容:
nm libmozjs-45.a > libmozjs-45.nm
我看到导出的def文件中有相同的条目,但看起来与链接器期望的不同(我推测):
?JS_GetPrivate@@YAPEAXPEAVJSObject@@@Z
修改1
我已经设法使用mingw-w64构建SpiderMonkey。现在,在链接时我收到以下错误:
undefined reference to `__imp__ZN17JSAutoCompartmentC1EP9JSContextP8JSObject'
在lib上查看nm
,我有:
d000536.o:
0000000000000000 i .idata$4
0000000000000000 i .idata$5
0000000000000000 i .idata$6
0000000000000000 i .idata$7
0000000000000000 t .text
0000000000000000 I __imp__ZN17JSAutoCompartmentC1EP9JSContextP8JSObjectON7mozilla6detail19GuardObjectNotifierE
U _head_mozjs_45_dll
0000000000000000 T _ZN17JSAutoCompartmentC1EP9JSContextP8JSObjectON7mozilla6detail19GuardObjectNotifierE
确实,班级的定义是:
class MOZ_RAII JS_PUBLIC_API(JSAutoCompartment)
{
JSContext* cx_;
JSCompartment* oldCompartment_;
public:
JSAutoCompartment(JSContext* cx, JSObject* target
MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
JSAutoCompartment(JSContext* cx, JSScript* target
MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
~JSAutoCompartment();
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
为什么同一个编译器将其导出为__imp__ZN17JSAutoCompartmentC1EP9JSContextP8JSObjectON7mozilla6detail19GuardObjectNotifierE
,但在引用它时,需要将其作为__imp__ZN17JSAutoCompartmentC1EP9JSContextP8JSObject
?
回答:错过了从构建中排除MOZ_GUARD_OBJECT_NOTIFIER_PARAM
的符号定义。