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

时间:2014-07-29 04:54:41

标签: javascript c++ linker-errors spidermonkey

我正在尝试在OSX上编译SpiderMonkey代码,但Xcode一直给我Mach-O Linker错误。

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

cd js/src
autoconf-2.13

mkdir build-release
cd build-release
../configure
make
然后我做了一个:

make install

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

标题搜索路径:

/usr/local/include/**

图书馆搜索路径:

/usr/local/lib/**

我已检查以确保相应的libmozjs-24.dylib文件夹中存在libmozjs-24.ausr。我将它们拖放到我的XCode项目中。

链接器错误

  

架构x86_64的未定义符号:
  “JS_ResolveStub(JSContext *,JS :: Handle,JS :: Handle)”,   引自:         main.o中的global_class“JS_PropertyStub(JSContext *,JS :: Handle,JS :: Handle,   JS :: MutableHandle)“,引自:         main.o中的global_class“JS_DeletePropertyStub(JSContext *,JS :: Handle,JS :: Handle,int *)”,引用自:         main.o中的global_class“JS_StrictPropertyStub(JSContext *,JS :: Handle,JS :: Handle,int,   JS :: MutableHandle)“,引自:         main.o中的global_class:未找到架构x86_64 clang的符号:错误:链接器命令失败,退出代码为1(使用-v为   见调用)

我正在尝试遵循以下“你好世界”

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通过终端使用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

1 个答案:

答案 0 :(得分:1)

还有更多modern how-to guide可用于演示针对您的问题的修复:不再指定Stubs。您的全球课程可以成为:

module.directive('myDirective', function () {
    return {
        controller: function ($scope, $element) {
            // ...
        }
    }
});

,您的运行时创建可以变为:

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

它至少应该编译。