【问题标题】:problems embedding lua in c++在 C++ 中嵌入 lua 的问题
【发布时间】:2012-07-31 14:32:15
【问题描述】:

我试图在 C++ 中嵌入 lua 代码,但遇到了一个奇怪的编译器错误。这是我的代码:

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

int main() {
    lua_State *luaVM = luaL_newstate();
    if (luaVM == NULL) {
        printf("Error initializing lua!\n");
        return -1;
    }

    luaL_openlibs(luaVM);

    luaL_dofile(luaVM, "test.lua");

    lua_close(luaVM);

    return 0;
}

编译:

g++ -Wall -o embed -llua embed.cpp

错误是:

g++ -Wall -o embed -llua embed.cpp
/tmp/ccMGuzal.o: In function `main':
embed.cpp:(.text+0x47): undefined reference to `luaL_loadfilex'
embed.cpp:(.text+0x72): undefined reference to `lua_pcallk'
collect2: error: ld returned 1 exit status

我没有从我的代码中调用luaL_loadfilexlua_pcallk,这有助于假设问题不在我的代码中,而在 lua 本身。有人在这里有什么想法吗?

更新

这是我的版本信息:

$ lua -v
Lua 5.2.0  Copyright (C) 1994-2011 Lua.org, PUC-Rio

【问题讨论】:

  • @MartinSchröder 请注意,这也是我的问题。我决定,在找出导致该问题的原因(lualib 不存在)后,最好将其作为一个新问题提出,并继续编辑该问题。
  • 啊。抱歉,我没注意到。

标签: c++ c lua


【解决方案1】:

在 lua 5.2.1 中 luaL_dofile 是一个宏,声明如下:

#define luaL_dofile(L, fn) \
    (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))

在您的 lua 版本中,它很可能使用 luaL_loadfilexlua_pcallk 实现,并且您会得到像 @Shahbaz 所说的未定义的引用。

【讨论】:

    【解决方案2】:

    5.1前回答:根据this website,如果包含lauxlib.hlualib.h,则需要在-llua后面加上-llualib

    g++ -Wall -o embed embed.cpp -llua -llualib
    

    更新

    愚蠢的我,您应该始终按照它们使用另一个的顺序链接文件/库。如果A使用B,则应在B之前提及A。

    在你的情况下,由于embed.cpp 使用lua,那么你应该写:

    g++ -Wall -o embed embed.cpp -llua
    

    【讨论】:

    • 根据this answer,lua >5.1中没有lualib。当我添加-llualib 时,我得到一个新错误,支持这个:/usr/bin/ld: cannot find -llualib
    • @ewok,你的 lua 版本是多少?
    • @Shabaz,我已移动链接,但无济于事。
    • @ewok,你得到完全相同的错误吗?!在 lua 的 lib 文件上尝试nm 并检查其中是否存在这些符号。
    • @ewok,你在 lua 的 lib 文件上nm 了吗?
    【解决方案3】:

    最终的问题是库的名称因版本而异。从存储库安装时,库称为 liblua5.xliblualib5.x,因此需要以下命令:

    g++ -Wall -o embed embed.cpp -llua5.2 -llualib5.2
    

    【讨论】:

      【解决方案4】:

      你可以使用:

      cc embed.cpp -o embed -llua -L../lua -I../lua -lm -ldl
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        • 2012-04-27
        • 2010-09-29
        相关资源
        最近更新 更多