title: Problems linking to Lua 5.2.4, even when compiling sources inline
body: <p>I have a file configuration.cpp:</p>
  
  <pre><code>#include "configuration.hpp"
  
  struct game_config* get_game_config(lua_State *L, char* script)
  {
      debug("Attempting to load configuration from %s", script);
      // Execute the script
      luaL_dofile(L, script);
  
      // The environment should now be prepped, we can get the config variables
      struct game_config* game_config;
  
      lua_getglobal(L, "WINDOW_WIDTH");
      game_config-&gt;screen_width = lua_tointeger(L, -1);
      lua_getglobal(L, "WINDOW_HEIGHT");
      game_config-&gt;screen_height = lua_tointeger(L, -1);
      lua_getglobal(L, "GAME_TITLE");
      game_config-&gt;game_title = lua_tostring(L, -1);
  
      debug("Loaded config for %s, at %dx%d", game_config-&gt;game_title, game_config-&gt;screen_width, game_config-&gt;screen_height);
  
      return game_config;
  };
  </code></pre>
  
  <p>which includes configuration.hpp:</p>
  
  <pre><code>#ifndef CONFIGURATION_HPP_INCLUDED
  #define CONFIGURATION_HPP_INCLUDED
  
  #include "common.hpp"
  #include "scripting.hpp"
  
  // Data structures
  
  struct game_config {
      int screen_width;
      int screen_height;
  
      const char *game_title;
  };
  
  /*
   * get_config
   * run a script and retrieve configuration data from it
   */
  
  struct game_config *get_game_config(lua_State*, char *);
  
  #endif // CONFIGURATION_HPP_INCLUDED
  </code></pre>
  
  <p>which includes <code>scripting.hpp</code>, in which the following lines import Lua5.2:</p>
  
  <pre><code>#include "lua.h"
  #include "lauxlib.h"
  #include "lualib.h"
  </code></pre>
  
  <p>When I add those lines to configuration.cpp, the program compiles and runs. However, when they are in any other file (configuration.hpp, scripting.hpp) it does not:</p>
  
  <pre><code>||=== Build: debug in rpfreedom (compiler: GNU GCC Compiler) ===|
  src/configuration.cpp||In function ‘game_config* get_game_config(lua_State*, char*)’:|
  src/configuration.cpp|13|warning: ‘game_config’ is used uninitialized in this function [-Wuninitialized]|
  src/main.cpp||In function ‘int main()’:|
  src/main.cpp|13|warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]|
  build/debug/configuration.o||In function `get_game_config(lua_State*, char*)':|
  /home/leo/projects/rpfreedom/src/configuration.cpp|7|undefined reference to `luaL_loadfilex(lua_State*, char const*, char const*)'|
  /home/leo/projects/rpfreedom/src/configuration.cpp|7|undefined reference to `lua_pcallk(lua_State*, int, int, int, int, int (*)(lua_State*))'|
  /home/leo/projects/rpfreedom/src/configuration.cpp|12|undefined reference to `lua_getglobal(lua_State*, char const*)'|
  /home/leo/projects/rpfreedom/src/configuration.cpp|13|undefined reference to `lua_tointegerx(lua_State*, int, int*)'|
  /home/leo/projects/rpfreedom/src/configuration.cpp|14|undefined reference to `lua_getglobal(lua_State*, char const*)'|
  /home/leo/projects/rpfreedom/src/configuration.cpp|15|undefined reference to `lua_tointegerx(lua_State*, int, int*)'|
  /home/leo/projects/rpfreedom/src/configuration.cpp|16|undefined reference to `lua_getglobal(lua_State*, char const*)'|
  /home/leo/projects/rpfreedom/src/configuration.cpp|17|undefined reference to `lua_tolstring(lua_State*, int, unsigned long*)'|
  build/debug/scripting.o||In function `scripting_init()':|
  /home/leo/projects/rpfreedom/src/scripting.cpp|7|undefined reference to `luaL_newstate()'|
  /home/leo/projects/rpfreedom/src/scripting.cpp|20|undefined reference to `lua_settop(lua_State*, int)'|
  build/debug/scripting.o||In function `scripting_report_errors(lua_State*, int)':|
  /home/leo/projects/rpfreedom/src/scripting.cpp|30|undefined reference to `lua_tolstring(lua_State*, int, unsigned long*)'|
  /home/leo/projects/rpfreedom/src/scripting.cpp|31|undefined reference to `lua_settop(lua_State*, int)'|
  build/debug/scripting.o:(.rodata+0x88)||undefined reference to `luaopen_base(lua_State*)'|
  Makefile|203|recipe for target 'bin/debug/rpfreedom' failed|
  Makefile|160|recipe for target 'debug' failed|
  ||=== Build failed: 15 error(s), 2 warning(s) (0 minute(s), 1 second(s)) ===|
  </code></pre>
  
  <p>Obviously, the inclusion of configuration.hpp works, because there are no errors regarding the game_config struct, which is defined there; ditto for recursive includes, since the debug() macro follows the path <code>debug.hpp -&gt; common.hpp -&gt; configuration.hpp -&gt; configuration.cpp</code>. So, why are the #includes for the Lua header files not working in a similar fashion?</p>
  
  <p>I decided to investigate; I ran <code>g++ -Iinclude -I/usr/include/lua5.2 -E src/configuration.cpp| grep lua_getglobal</code> to view the preprocessor output, and it turns out that... they are. Along with its uses in the source code, that command returns:</p>
  
  <pre><code>extern void (lua_getglobal) (lua_State *L, const char *var);
  </code></pre>
  
  <p>So, I have no idea what is going on.</p>
  
  <p>EDIT: Turns out that I have to do <code>extern C {}</code> around my <code>#include</code>s for Lua. However, now, only in configuration.hpp (not in scripting.hpp, where the Lua headers are included) I am getting another error:</p>
  
  <pre><code>include/configuration.hpp:21:37: error: ‘lua_State’ was not declared in this scope
   struct game_config *get_game_config(lua_State*, char *);
  </code></pre>
  
  <p>However, the use of lua_State in scripting.cpp and scripting.hpp is not affected.</p>
  
  <p>EDIT 2: Apparently the recommended way to embed Lua 5.2 is to compile it with your project, because it is very small, so I did so. However, even though the link command that my Makefile generates clearly links all my object files with the Lua object files:</p>
  
  <pre><code>g++ build/release/configuration.o build/release/lua5.2.4/lparser.c.o build/release/lua5.2.4/lcode.c.o build/release/lua5.2.4/lundump.c.o build/release/lua5.2.4/lzio.c.o build/release/lua5.2.4/ldo.c.o build/release/lua5.2.4/lapi.c.o build/release/lua5.2.4/lgc.c.o build/release/lua5.2.4/lfunc.c.o build/release/lua5.2.4/ldump.c.o build/release/lua5.2.4/ltable.c.o build/release/lua5.2.4/lcorolib.c.o build/release/lua5.2.4/loslib.c.o build/release/lua5.2.4/liolib.c.o build/release/lua5.2.4/ltm.c.o build/release/lua5.2.4/lmem.c.o build/release/lua5.2.4/lctype.c.o build/release/lua5.2.4/lauxlib.c.o build/release/lua5.2.4/ldebug.c.o build/release/lua5.2.4/lobject.c.o build/release/lua5.2.4/loadlib.c.o build/release/lua5.2.4/linit.c.o build/release/lua5.2.4/lmathlib.c.o build/release/lua5.2.4/llex.c.o build/release/lua5.2.4/lstate.c.o build/release/lua5.2.4/lopcodes.c.o build/release/lua5.2.4/lstrlib.c.o build/release/lua5.2.4/lbaselib.c.o build/release/lua5.2.4/ltablib.c.o build/release/lua5.2.4/ldblib.c.o build/release/lua5.2.4/lbitlib.c.o build/release/lua5.2.4/lvm.c.o build/release/lua5.2.4/lstring.c.o build/release/scripting.o build/release/main.o  -L/usr/lib/x86_64-linux-gnu -Lm -Ldl -lsfml-graphics -lsfml-window -lsfml-audio -lsfml-network -lsfml-system   -o bin/release/rpfreedom
  </code></pre>
  
  <p>I am getting the same linker errors I was getting earlier.</p>
  
  <p>Does the order of arguments to the linker matter?</p>