title: Error while compiling an embedded SpiderMonkey program
body: <p>Alright, so I downloaded the SpiderMonkey source code using the command <code>wget http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz</code> and extracted it. Then I successfully built the include files and static library by executing the following commands:</p>
  
  <ol>
  <li><code>autoconf2.13</code></li>
  <li><code>./configure --prefix=~/js --disable-shared-js</code></li>
  <li><code>make</code></li>
  <li><code>make install</code></li>
  </ol>
  
  <p>Now I tried compiling the following code using the command <code>g++ -I/home/aaditmshah/js/include/js -L/home/aaditmshah/js/lib -lmozjs185-1.0 -ldl -lm -ldl helloworld.cpp -o helloworld</code>:</p>
  
  <pre><code>/*
   * 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-&gt;filename ? report-&gt;filename : "&lt;no filename=\"filename\"&gt;",
              (unsigned int) report-&gt;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, &amp;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, &amp;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;
  }
  </code></pre>
  
  <p>I know that my <code>include</code> and <code>linker</code> options point to the correct directories. The include files are in <code>/home/aaditmshah/js/include/js</code> and the static library named <code>libmozjs185-1.0</code> is in <code>/home/aaditmshah/js/lib</code>. However it still produces the following error:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>I wonder which files am I missing. Should I rebuild SpiderMonkey and install it in <code>/usr/local</code>? Any help will be greatly appreciated.</p>
  
  <p>I'm pretty sure that the problem's not that I'm using a static library. I rebuilt SpiderMonkey as a shared object library and it still gave me the same error.</p>