【问题标题】:How to fix this error I get while attempting to execute a Lua file via C++?如何解决我在尝试通过 C++ 执行 Lua 文件时遇到的这个错误?
【发布时间】:2015-12-06 02:32:56
【问题描述】:

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

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

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

Undefined symbols for architecture x86_64:
  "lua_settop(lua_State*, int)", referenced from:
      _main in lual-8d0dcd.o
  "luaopen_base(lua_State*)", referenced from:
      main::lualibs in lual-8d0dcd.o
  "luaL_newstate()", referenced from:
      _main in lual-8d0dcd.o
  "lua_close(lua_State*)", referenced from:
      _main in lual-8d0dcd.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是 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;
}

谁能帮帮我?

谢谢。

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

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

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

    这是因为 Lua 是用 C 语言编写的,因此只需将函数名称用作符号名称即可以“C 方式”导出函数。您的 C++ 程序希望将符号命名为“C++ 方式”,其中包括编码类型信息。 extern "C" 块强制使用 C 样式的符号命名。

    正如@ChrisBeck 建议的那样,您只需将 Lua 源代码添加到您的项目中,然后像 C++ 一样编译它们。然后函数将以 C++ 风格的名称导出。

    【讨论】:

    • 可能想提一下替代方案,他们可以将 lua 源导入他们的项目并将其编译为 C++,然后他们不需要 extern "C" 块。许多项目这样做是有充分理由的
    • 我通过包含“lua.hpp”实现了你所说的(它的内容是extern "C" { ... }。我仍然遇到同样的错误。
    • @David:要么你应该将 lua 单独编译为 C,然后在任何包含它的地方使用 extern "C",或者将它编译为 C++,然后不要使用 extern "C"。如果你两者都做,你会得到与都不做相同的错误。基本上问题是 C++ 做了一些称为名称修改的事情,以使其函数看起来像 C 函数,并且每当您调用某些东西时,它都会查找该名称的修改版本。 Extern "C" 在查找符号时或多或少会禁用修饰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2022-09-29
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多