从64位mscv ++ lib

时间:2016-07-24 17:00:55

标签: c++ linker dllimport

我在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的符号定义。

0 个答案:

没有答案