简体   繁体   中英

Lua 5.2: undefined symbols when using luaL_dofile()

I was trying to do some simple Lua 5.2 embedding using the following C++ code:

void dnLuaRunner::Exec(string file)
{
    // Initialize the lua interpreter.
    lua_State * L;
    L = luaL_newstate();

    // Load lua libraries.
    static const luaL_Reg luaLibs[] =
    {
        {"math", luaopen_math},
        {"base", luaopen_base},
        {NULL, NULL}
    };

    // Loop through all the functions in the array of library functions
    // and load them into the interpreter instance.
    const luaL_Reg * lib = luaLibs;
    for (; lib->func != NULL; lib++)
    {
        lib->func(L);
        lua_settop(L, 0);
    }

    // Run the file through the interpreter instance.
    luaL_dofile(L, file.c_str());

    // Free memory allocated by the interpreter instance.
    lua_close(L);
}

The first part is some basic initialization and code for loading some standard library modules, but when I called luaL_dofile(...) it seemed to be raising some errors for undefined symbols. luaL_dofile is a macro that uses functions like luaL_loadfile and lua_pcall , so it didn't look extremely scary that I was getting the following linker errors:

  "_luaL_loadfilex", referenced from:
      dnLuaRunner::Exec(std::string) in dnLuaRunner.cc.o
  "_lua_pcallk", referenced from:
      dnLuaRunner::Exec(std::string) in dnLuaRunner.cc.o
ld: symbol(s) not found for architecture x86_64

I was linking liblua.a correctly in the Makefile.

Turns out you need to add -lm along with -llua and they both must be after the file you want to compile, like so:

# or clang++ works too
$ g++ ... foofy.c -llua -lm

I have also seen circumstances where you must use -ldl at the end as well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM