在OSX上运行c++ SpiderMonkey会产生链接器错误

Running C++ SpiderMonkey on OSX produces Linker errors

本文关键字:链接 错误 SpiderMonkey OSX 运行 c++      更新时间:2023-10-16

我试图在OSX上编译SpiderMonkey代码,但Xcode一直给我Mach-O链接器错误。

为了构建,我遵循Mozilla的说明:

cd js/src
autoconf-2.13
mkdir build-release
cd build-release
../configure
make

我然后做a:

make install

将标题,a和dylib放入我的/usr/local/文件夹。为了将Xcode指向标头,我有:

头搜索路径:

/usr/local/include/**

Library Search Paths:

/usr/local/lib/**

我已经检查以确保libmozjs-24.dyliblibmozjs-24.a存在于各自的usr文件夹中。我把它们拖放到我的XCode项目中。

<

链接器错误/strong>

架构x86_64:
未定义符号"JS_ResolveStub(JSContext*, JS::Handle, JS::Handle)",引用:main中的Global_class。JS_PropertyStub(JSContext*, JS::Handle, JS::Handle)JS::MutableHandle)",引用自:main中的Global_class。0"JS_DeletePropertyStub(JSContext*, JS::Handle, JS::Handle, int*)",引用自:main中的Global_class。JS_StrictPropertyStub(JSContext*, JS::Handle, JS::Handle, int,JS::MutableHandle)",引用自:main中的Global_class。clang: error: linkker命令失败,退出代码为1(使用-v to。见调用)

我正在尝试遵循下面的"hello world"

https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_User_Guide

和我的代码如下:

#define JS_DEBUG 1
/* Include the JSAPI header file to get access to SpiderMonkey. */
#include <jsapi.h>
static JSClass global_class = { "global",
    JSCLASS_NEW_RESOLVE | JSCLASS_GLOBAL_FLAGS,
    JS_PropertyStub,
    JS_DeletePropertyStub,
    JS_PropertyStub,
    JS_StrictPropertyStub,
    JS_EnumerateStub,
    JS_ResolveStub,
    JS_ConvertStub,
    nullptr,
    JSCLASS_NO_OPTIONAL_MEMBERS
};
int run(JSContext *cx) {
    JSAutoRequest ar(cx);
    JSObject *global = JS_NewGlobalObject(cx, &global_class, nullptr);
    if (!global)
        return 1;
    return 0;
}
int main(int argc, const char *argv[])
{
    JSRuntime * runtime;
    runtime = JS_NewRuntime(8L * 1024L * 1024L, JS_NO_HELPER_THREADS);
    if (runtime == NULL) {
        fprintf(stderr, "cannot create runtime");
        exit(EXIT_FAILURE);
    }
    /* Create a context. */
    JSContext *cx = JS_NewContext(runtime, 8192);
    if (!cx)
        return 1;
    JS_SetOptions(cx, JSOPTION_VAROBJFIX);
    //JS_SetErrorReporter(cx, reportError);
    int result = run(cx);
    JS_DestroyContext(cx);
    JS_DestroyRuntime(runtime);
    /* Shut down the JS engine. */
    JS_ShutDown();
    return result;
}

似乎部分代码没有链接问题,但其他代码有。

任何希望都是非常感激的!

编辑

我使用GCC在终端上运行相同的代码,使用:

g++ -I/usr/local/include /usr/local/lib/libmozjs-24.a -lm -ldl main.cpp -o main
我得到一个输出:

Undefined symbols for architecture x86_64:
  "JS_ResolveStub(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>)", referenced from:
      global_class in main-fa83e1.o
  "JS_PropertyStub(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>,     JS::MutableHandle<JS::Value>)", referenced from:
      global_class in main-fa83e1.o
  "JS_DeletePropertyStub(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>, int*)", referenced from:
      global_class in main-fa83e1.o
  "JS_StrictPropertyStub(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>, int,     JS::MutableHandle<JS::Value>)", referenced from:
  global_class in main-fa83e1.o

有一个更现代的操作指南,它演示了如何修复您的问题:不要再指定存根了。你的全局类可以变成:

static JSClass global_class = {
    "global",
    JSCLASS_GLOBAL_FLAGS
};

和你的运行时创建可以变成:

runtime = JS_NewRuntime(8L * 1024L * 1024L);

,它至少应该编译。