2013-12-18 77 views
1

我試圖做一些簡單的Lua 5.2使用下面的C嵌入++代碼:的Lua 5.2:使用luaL_dofile時未定義的符號()

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); 
} 

第一部分是一些基本的初始化和代碼,用於加載一些標準庫模塊,但是當我打電話給luaL_dofile(...)時,它似乎給未定義的符號提出了一些錯誤。 luaL_dofile是使用功能,如luaL_loadfilelua_pcall宏,所以它沒有看起來非常嚇人,我是得到以下鏈接錯誤:

"_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 

我在Makefile正確連接liblua.a

回答

3

原來你需要添加-lm-llua一起,他們都必須是要編譯,像這樣的文件後:

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

我也看到情況下,您必須使用-ldl在最後也是如此。

+0

正如我記得,'-ldl'也是必需的。鏈接器選項,沒什麼特別之處。 – Kamiccolo

+0

@Kamiccolo我只是嘗試了'-llua'和'-ldl',但只是'-llua'和'-lm'對我​​很好。 – beakr

+0

@beakr'-lm'用於'math.h'頭文件嗎?我被告知,如果我在我的.c文件中使用'math.h'函數,編譯時需要包含'-lm'。但是,編譯gcc時似乎並不需要包含它。那麼,它是特定於編譯器嗎? –