我试图在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_loadfilex
或lua_pcallk
,这有助于假设问题不在我的代码中,而在于lua本身。有没有人有任何想法?
更新
这是我的版本信息:
$ lua -v
Lua 5.2.0 Copyright (C) 1994-2011 Lua.org, PUC-Rio
答案 0 :(得分:2)
Pre 5.1回答:根据this website,如果您添加-llualib
和-llua
,则需要在lauxlib.h
之后添加lualib.h
:
g++ -Wall -o embed embed.cpp -llua -llualib
愚蠢的我,你应该总是按照他们使用另一个的顺序链接文件/库。如果A
使用B
,则应在B之前提及A.
在您的情况下,由于embed.cpp
使用lua
,因此您应该写:
g++ -Wall -o embed embed.cpp -llua
答案 1 :(得分:2)
in in lua 5.2.1 luaL_dofile
是一个声明如下的宏:
#define luaL_dofile(L, fn) \
(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
在您的lua版本中,很可能会使用luaL_loadfilex
和lua_pcallk
来实现,并且您会得到@Shahbaz所说的未定义引用。
答案 2 :(得分:2)
最终问题是库的名称因版本而异。从存储库安装时,库称为liblua5.x
和liblualib5.x
,因此需要以下命令:
g++ -Wall -o embed embed.cpp -llua5.2 -llualib5.2
答案 3 :(得分:0)
您可以使用:
cc embed.cpp -o embed -llua -L../lua -I../lua -lm -ldl