我试图在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本身。有人有任何想法吗?
UPDATE
这是我的版本信息:
$ lua -v
Lua 5.2.0 Copyright (C) 1994-2011 Lua.org, PUC-Rio
在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所说的未定义的引用。
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
最终问题是库的名称因版本而异。从存储库安装时,库名为liblua5.x
和liblualib5.x
,因此需要以下命令:
g++ -Wall -o embed embed.cpp -llua5.2 -llualib5.2
您可以使用:
cc embed.cpp -o embed -llua -L../lua -I../lua -lm -ldl