在C ++中嵌入Lua的问题

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

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

    返回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
点赞
用户912144
用户912144

5.1版本之前的答案:根据这个网站,如果你包含了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
2012-07-31 14:36:19
用户1554020
用户1554020

在 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 所说的那样。

2012-07-31 14:40:37
用户702948
用户702948

最终问题在于不同版本的库名称不同。当从仓库安装时,这些库被称为 liblua5.xliblualib5.x,因此需要运行以下命令:

g++ -Wall -o embed embed.cpp -llua5.2 -llualib5.2
2012-09-12 12:58:19
用户11075752
用户11075752

你可以使用:

cc embed.cpp -o embed -llua -L../lua -I../lua -lm -ldl
2019-02-17 19:11:11