2012-04-18 10 views
8

Muy bien, así que descargué el código fuente de SpiderMonkey usando el comando wget http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz y lo extraje. A continuación, he construido correctamente los archivos y la biblioteca estática ejecutando los siguientes comandos incluyen:Error al compilar un programa SpiderMonkey incrustado

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

Ahora he intentado compilar el siguiente código utilizando la comando 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; 
} 

Sé que mis opciones include y linker apuntan a los directorios correctos. Los archivos de inclusión están en /home/aaditmshah/js/include/js y la biblioteca estática llamada libmozjs185-1.0 está en /home/aaditmshah/js/lib. Sin embargo, todavía produce el siguiente error:

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 

Me pregunto qué archivos me falta. ¿Debo reconstruir SpiderMonkey e instalarlo en /usr/local? Cualquier ayuda será apreciada.

Estoy bastante seguro de que el problema no es que esté usando una biblioteca estática. Reconstruí SpiderMonkey como una biblioteca de objetos compartidos y todavía me dio el mismo error.

+1

Lamento decir esto, pero a mí me funcionó. Recibo las dos advertencias de C++, pero no hay errores de enlazador. El ejecutable resultante funciona bien. Estoy en una Mac. Es posible que desee ver la salida de 'nm libmozjs185-1.0.a | grep JS_NewContext'. Obtengo una línea que dice '00000000000016d0 T _JS_NewContext'. –

+0

Obtengo una línea que dice '0000000000003500 T JS_NewContext', que supongo que significa que' JS_NewContext' tiene un valor de '13568'. No estoy seguro de qué hacer con esta salida. –

Respuesta

1

Puede probar esto:

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

decir. agregue el archivo directamente en la línea de comando g ++. Es posible que deba especificar algunas combinaciones de estos si no está funcionando. (Con gcc 4.2 esto funcionó para mí):

-static -lmozjs185 

sólo tiene que especificar la ruta correcta para mozjs185-1.0.a.

+0

No, todavía no funciona. ¿Qué significan las opciones '-lm' y' -ldl'? Estoy usando la versión de g ++ 'g ++ - 4.6.real (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1'. –

0

En Ubuntu 12.10, versión gcc gcc versión 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) y SipderMonkey v1.8.5: El comando es sudo g++ -o helloworld -I /usr/local/include/js helloworld.cpp -lmozjs185-1.0 -L /usr/local/lib -lpthread ¡Pase más tiempo del esperado haciendo algo tan simple suspiro! No, gracias a Firefox/Mozilla.

Cuestiones relacionadas