c++ - lua_pcall 去哪儿了? (OSX Lion 上的 Lua 5.2.0)

标签 c++ linker compiler-errors lua symbols

问题:

$ 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 的作用相同,但具有能够屈服的好处,但 pcall 应该仍然可用......

更新:我刚刚意识到我正在尝试使用较旧的(5.1?) header 链接到 5.2...有人知道哪里有一个列表说明哪些 header 是必需的?我不需要 Lua 源中的所有 header 。

从这里看到的内容我们可以推断,在 5.2 中 pcall 是使用 _lua_pcallk 实现的。

最佳答案

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

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

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

关于c++ - lua_pcall 去哪儿了? (OSX Lion 上的 Lua 5.2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10959017/

相关文章:

c++ - 为什么使用指针而不是直接实例化对象时不使用类成员的默认值?

linux - 链接时 LD_LIBRARY_PATH 和 -L 有什么区别?

java - “找不到符号”或“无法解析符号”错误是什么意思?

java - 如何对扩展类的ArrayList进行排序?

c++ - 在 C++ 中迭代 .bmp 的像素

c++ - 将输入解释为十六进制数

c++ - 让链接器找到qt5

c++ - 如何使用另一个版本的库

c++ - 模板标签的困惑

c++ - 为什么 [[maybe_unused]] 在捕获的列表中是不可能的?