lua_pcall 去哪儿了?(在 OSX Lion 上的 Lua 5.2.0)

问题:

$ clang++ -L../lib/osx/ -I../include/ -o test Script.cpp Main.cpp Verbose.cpp -llua -lUnitTest++
Undefined symbols for architecture x86_64:
  "_lua_pcall", referenced from:
      LuaSystem::dostring(char const*) in Script-EgY0dM.o
     (maybe you meant: _lua_pcallk)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

让我们来看看我的 lua 构建:

$ cd src/
stevenlu443@steven-mba(Jun 09 02:41:58)[~/Downloads/lua-5.2.0/src]
$ ls
Makefile   lcorolib.c ldump.o    llex.o     lopcodes.o ltable.c   luac.c
lapi.c     lcorolib.o lfunc.c    llimits.h  loslib.c   ltable.h   luac.o
lapi.h     lctype.c   lfunc.h    lmathlib.c loslib.o   ltable.o   luaconf.h
lapi.o     lctype.h   lfunc.o    lmathlib.o lparser.c  ltablib.c  lualib.h
lauxlib.c  lctype.o   lgc.c      lmem.c     lparser.h  ltablib.o  lundump.c
lauxlib.h  ldblib.c   lgc.h      lmem.h     lparser.o  ltm.c      lundump.h
lauxlib.o  ldblib.o   lgc.o      lmem.o     lstate.c   ltm.h      lundump.o
lbaselib.c ldebug.c   liblua.a   loadlib.c  lstate.h   ltm.o      lvm.c
lbaselib.o ldebug.h   linit.c    loadlib.o  lstate.o   lua        lvm.h
lbitlib.c  ldebug.o   linit.o    lobject.c  lstring.c  lua.c      lvm.o
lbitlib.o  ldo.c      liolib.c   lobject.h  lstring.h  lua.h      lzio.c
lcode.c    ldo.h      liolib.o   lobject.o  lstring.o  lua.hpp    lzio.h
lcode.h    ldo.o      llex.c     lopcodes.c lstrlib.c  lua.o      lzio.o
lcode.o    ldump.c    llex.h     lopcodes.h lstrlib.o  luac
stevenlu443@steven-mba(Jun 09 02:41:59)[~/Downloads/lua-5.2.0/src]
$ nm liblua.a | grep _lua_pcall
115:0000000000001a30 T _lua_pcallk
116:0000000000003b40 S _lua_pcallk.eh
1563:                 U _lua_pcallk
1839:                 U _lua_pcallk
stevenlu443@steven-mba(Jun 09 02:42:12)[~/Downloads/lua-5.2.0/src]
$ nm *.o | grep _lua_pcall
115:0000000000001a30 T _lua_pcallk
116:0000000000003b40 S _lua_pcallk.eh
597:                 U _lua_pcallk
977:                 U _lua_pcallk
2630:                 U _lua_pcallk
2760:                 U _lua_pcallk

为什么 _lua_pcall 不存在呢?5.2 的文档似乎表明 pcallk 做的和 pcall 一样,但是papll应该是可用的...

更新:我刚意识到我正在试图链接到使用较旧的(5.1?)头文件的 5.2... 有谁知道有哪个列表说哪些头文件是必需的吗?我不需要所有来自 Lua 源的头文件。

从这里我们可以推断,在 5.2 中,pcall 使用 _lua_pcallk 实现。

点赞
用户107090
用户107090

要编译使用Lua C API的程序,您需要包含 lua.h,通常还需要包括 lauxlib.h,有时需要包括 lualib.h

当您更改Lua的版本,例如从5.1更改为5.2,您需要重新编译程序。当您更改同一版本的发行版,例如从5.1.4更改为5.1.5时,您不需要重新编译,只需重新链接即可。

当然,在所有情况下,请确保使用一致的头文件和库,即不要混合使用来自不同版本或发行版的头文件和库。

2012-06-09 11:27:03