如何修复我在尝试通过C++执行Lua文件时遇到的错误?

我正在尝试使用C++执行Lua文件。

我正在运行Mac OS X,Lua 5.3位于/usr/local/include中

当我尝试执行Lua文件时,我收到以下错误:

未定义符号体系结构x86_64:
  “lua_settop(lua_State*,int)”,引用自:
      _main in lual-8d0dcd.o
  “luaopen_base(lua_State*)”,引用自:
      main::lualibs in lual-8d0dcd.o
  “luaL_newstate()”,引用自:
      _main in lual-8d0dcd.o
  “lua_close(lua_State*)”,引用自:
      _main in lual-8d0dcd.o
ld:找不到符号(s)适用于架构x86_64
clang:错误:链接器命令失败,退出代码1(使用-v查看调用)

这是C++文件:

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main(int argc, char* argv[]) {

    lua_State *lua_state;
    lua_state = luaL_newstate();

    static const luaL_Reg lualibs[] = {
        { "base", luaopen_base },
        { NULL, NULL}
    };

    const luaL_Reg *lib = lualibs;
    for(; lib->func != NULL; lib++) {
        lib->func(lua_state);
        lua_settop(lua_state, 0);
    }

    luaL_dofile(lua_state, "helloworld.lua");

    lua_close(lua_state);

    return 0;
}

有人能帮帮我吗?

谢谢。

点赞
用户2337954
用户2337954

你需要在你的 include 语句周围添加一个 extern "C" 块:

extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}

原因是 Lua 用 C 写成,因此通过简单地使用函数名作为符号名称来导出函数。你的 C++ 程序期望符号使用编码的类型信息来命名,这是 C++ 的方式。extern "C" 块强制符号使用 C 风格命名。

如@ChrisBeck建议的那样,你可以将 Lua 源代码添加到你的项目中并将它们编译为 C++。然后函数将使用 C++ 风格名称导出。

2015-09-10 00:27:57