2012-04-18 18 views
8

W porządku, więc pobrałem kod źródłowy SpiderMonkey za pomocą komendy wget http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz i wyodrębniłem go. Potem powodzeniem zbudował zawierać pliki i biblioteki statyczne, wykonując następujące polecenia:Błąd podczas kompilowania osadzonego programu SpiderMonkey

  1. autoconf2.13
  2. ./configure --prefix=~/js --disable-shared-js
  3. make
  4. make install

Teraz Próbowałem kompilowanie następujący kod używając polecenie g++ -I/home/aaditmshah/js/include/js -L/home/aaditmshah/js/lib -lmozjs185-1.0 -ldl -lm -ldl helloworld.cpp -o helloworld:

/* 
* This define is for Windows only, it is a work-around for bug 661663. 
*/ 
#ifdef _MSC_VER 
# define XP_WIN 
#endif 

/* Include the JSAPI header file to get access to SpiderMonkey. */ 
#include "jsapi.h" 

/* The class of the global object. */ 
static JSClass global_class = { 
    "global", JSCLASS_GLOBAL_FLAGS, 
    JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, 
    JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, 
    JSCLASS_NO_OPTIONAL_MEMBERS 
}; 

/* The error reporter callback. */ 
void reportError(JSContext *cx, const char *message, JSErrorReport *report) 
{ 
    fprintf(stderr, "%s:%u:%s\n", 
      report->filename ? report->filename : "<no filename=\"filename\">", 
      (unsigned int) report->lineno, 
      message); 
} 

int main(int argc, const char *argv[]) 
{ 
    /* JSAPI variables. */ 
    JSRuntime *rt; 
    JSContext *cx; 
    JSObject *global; 

    /* Create a JS runtime. You always need at least one runtime per process. */ 
    rt = JS_NewRuntime(8 * 1024 * 1024); 
    if (rt == NULL) 
     return 1; 

    /* 
    * Create a context. You always need a context per thread. 
    * Note that this program is not multi-threaded. 
    */ 
    cx = JS_NewContext(rt, 8192); 
    if (cx == NULL) 
     return 1; 
    JS_SetOptions(cx, JSOPTION_VAROBJFIX | JSOPTION_JIT | JSOPTION_METHODJIT); 
    JS_SetVersion(cx, JSVERSION_LATEST); 
    JS_SetErrorReporter(cx, reportError); 

    /* 
    * Create the global object in a new compartment. 
    * You always need a global object per context. 
    */ 
    global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL); 
    if (global == NULL) 
     return 1; 

    /* 
    * Populate the global object with the standard JavaScript 
    * function and object classes, such as Object, Array, Date. 
    */ 
    if (!JS_InitStandardClasses(cx, global)) 
     return 1; 

    /* Your application code here. This may include JSAPI calls 
    * to create your own custom JavaScript objects and to run scripts. 
    * 
    * The following example code creates a literal JavaScript script, 
    * evaluates it, and prints the result to stdout. 
    * 
    * Errors are conventionally saved in a JSBool variable named ok. 
    */ 
    char *script = "'Hello ' + 'World!'"; 
    jsval rval; 
    JSString *str; 
    JSBool ok; 
    const char *filename = "noname"; 
    uintN lineno = 0; 

    ok = JS_EvaluateScript(cx, global, script, strlen(script), 
          filename, lineno, &rval); 
    if (rval == NULL | rval == JS_FALSE) 
     return 1; 

    str = JS_ValueToString(cx, rval); 
    printf("%s\n", JS_EncodeString(cx, str)); 

    /* End of your application code */ 

    /* Clean things up and shut down SpiderMonkey. */ 
    JS_DestroyContext(cx); 
    JS_DestroyRuntime(rt); 
    JS_ShutDown(); 
    return 0; 
} 

Wiem, że moje opcje include i linker wskazują prawidłowe katalogi. Pliki włączeń znajdują się w /home/aaditmshah/js/include/js, a biblioteka statyczna o nazwie libmozjs185-1.0 znajduje się w /home/aaditmshah/js/lib. Jednak nadal generuje następujący błąd:

helloworld.cpp: In function ‘int main(int, const char**)’: 
helloworld.cpp:74:20: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 
helloworld.cpp:83:17: warning: NULL used in arithmetic [-Wpointer-arith] 
/tmp/ccUU9may.o: In function `main': 
helloworld.cpp:(.text+0x6e): undefined reference to `JS_Init' 
helloworld.cpp:(.text+0x94): undefined reference to `JS_NewContext' 
helloworld.cpp:(.text+0xba): undefined reference to `JS_SetOptions' 
helloworld.cpp:(.text+0xcb): undefined reference to `JS_SetVersion' 
helloworld.cpp:(.text+0xdc): undefined reference to `JS_SetErrorReporter' 
helloworld.cpp:(.text+0xf2): undefined reference to `JS_NewCompartmentAndGlobalObject' 
helloworld.cpp:(.text+0x11a): undefined reference to `JS_InitStandardClasses' 
helloworld.cpp:(.text+0x191): undefined reference to `JS_EvaluateScript' 
helloworld.cpp:(.text+0x1c8): undefined reference to `JS_ValueToString' 
helloworld.cpp:(.text+0x1df): undefined reference to `JS_EncodeString' 
helloworld.cpp:(.text+0x1f3): undefined reference to `JS_DestroyContext' 
helloworld.cpp:(.text+0x1ff): undefined reference to `JS_Finish' 
helloworld.cpp:(.text+0x204): undefined reference to `JS_ShutDown' 
/tmp/ccUU9may.o:(.data+0x10): undefined reference to `JS_PropertyStub' 
/tmp/ccUU9may.o:(.data+0x18): undefined reference to `JS_PropertyStub' 
/tmp/ccUU9may.o:(.data+0x20): undefined reference to `JS_PropertyStub' 
/tmp/ccUU9may.o:(.data+0x28): undefined reference to `JS_StrictPropertyStub' 
/tmp/ccUU9may.o:(.data+0x30): undefined reference to `JS_EnumerateStub' 
/tmp/ccUU9may.o:(.data+0x38): undefined reference to `JS_ResolveStub' 
/tmp/ccUU9may.o:(.data+0x40): undefined reference to `JS_ConvertStub' 
/tmp/ccUU9may.o:(.data+0x48): undefined reference to `JS_FinalizeStub' 
collect2: ld returned 1 exit status 

Zastanawiam się, których plików brakuje. Czy powinienem odbudować SpiderMonkey i zainstalować go w /usr/local? Każda pomoc zostanie bardzo doceniona.

Jestem prawie pewien, że problem nie polega na tym, że używam biblioteki statycznej. Przebudowałem SpiderMonkey jako bibliotekę obiektów wspólnych i nadal dawał mi ten sam błąd.

+1

Naprawdę przykro mi to mówić, ale to działało dobrze dla mnie. Dostaję oba ostrzeżenia C++, ale nie ma błędów łącznika. Wynikowy plik wykonywalny działa poprawnie. Jestem na Macu. Możesz spojrzeć na wynik 'nm libmozjs185-1.0.a | grep JS_NewContext'. Dostaję wiersz z napisem '00000000000016d0 T _JS_NowyContext'. –

+0

Otrzymuję wiersz z napisem '0000000000003500 T JS_NewContext', który zakładam, że' JS_NewContext' ma wartość '13568'. Nie jestem pewien, co zrobić z tym wynikiem. –

Odpowiedz

1

Można spróbować to:

g++ -I/home/aaditmshah/js/include/js /home/aaditmshah/js/lib/mozjs185-1.0.a -lm -ldl helloworld.cpp -o helloworld 

tj. dodaj archiwum bezpośrednio w wierszu poleceń g ++. Może być konieczne określenie niektórych kombinacji tych opcji, jeśli nie działa. (Z gcc 4.2 to działało dla mnie):

-static -lmozjs185 

Po prostu podaj poprawną ścieżkę dla mozjs185-1.0.a.

+0

Nie, nadal nie działa. Co oznaczają opcje '-lm' i' -ldl'? Używam g ++ wersji 'g ++ - 4.6.real (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1'. –

0

Na Ubuntu 12.10, g ++ wersja gcc w wersji 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) i SipderMonkey v1.8.5: Polecenie to sudo g++ -o helloworld -I /usr/local/include/js helloworld.cpp -lmozjs185-1.0 -L /usr/local/lib -lpthread Spędź więcej niż oczekiwano czasu, wykonując coś tak prostego westchnienia! Nie, dzięki FireFox/Mozilla.

Powiązane problemy