我将 Lua 嵌入到 C++ 应用程序中,但出现以下链接错误:
g++ -o dist/Debug/GNU-Linux-x86/testluaembed build/Debug/GNU-Linux-x86/src/main.o build/Debug/GNU-Linux-x86/src/LuaBinding.o -L../../mainline/tanlib_core/dist/Debug/GNU-Linux-x86 -L../../mainline/tanlib++/dist/Debug/GNU-Linux-x86 -L/usr/lib ../../mainline/tanlib_core/dist/Debug/GNU-Linux-x86/libtanlib_core.so ../../mainline/tanlib++/dist/Debug/GNU-Linux-x86/libtanlibpp.so /usr/lib/liblua5.1.a /usr/lib/libtolua++5.1.a /usr/local/boost_1_45_0/stage/lib/libboost_filesystem.a /usr/local/boost_1_45_0/stage/lib/libboost_system.a
/usr/lib/liblua5.1.a(loadlib.o): In function `ll_loadfunc':
/usr/lib/liblua5.1.a(loadlib.o): In function `ll_loadfunc':
/usr/lib/liblua5.1.a(loadlib.o): In function `ll_loadfunc':
/usr/lib/liblua5.1.a(loadlib.o): In function `ll_loadfunc':
/usr/lib/liblua5.1.a(loadlib.o): In function `gctm':
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/testluaembed] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
有人知道为什么会出现这些错误,以及如何解决这些错误吗?
最佳答案
在http://lua-users.org/wiki/BuildingLua
有一个注释:
在C++应用程序中嵌入Lua的注意事项
请注意,Lua 是 ANSI C 的干净子集,可以编译为 C 或 C++。 Lua headers 中没有 {#ifdef __cplusplus extern "C"{#endif ... Lua header ...#ifdef __cplusplus}#endif } 这样 lua 可以通过更改名称编译为 C 或 C++文件,而无需对文件内容进行任何更改。
如果 lua 被编译为 C 库,这是典型的预打包二进制文件,为了将 Lua 嵌入 C++ 应用程序(即将 C 链接到 C++),您必须在包含的地方放置 extern "C"C++ 应用程序中的 Lua header ,例如,
extern "C" {
#include "lua.h"
}
如果不这样做,您可能会因为 C++ 名称重整而出现链接错误。
请不要在邮件列表上提示这个。 :-) 花点时间搜索邮件列表,因为这在之前已经讨论过很多次了。
有人可能会争辩说,如果你正在分发库的预打包二进制文件,那么你已经将 lua 核心编译为 C(最有可能)或 C++,如果你将 lua 编译为 C,你应该修改lua header 来指示这一点。但是,作者不推荐使用预构建的 lua 库,他们建议直接将 lua 源代码合并到您的应用程序中。有关讨论(页面末尾),请参阅 BuildingModules。
默认情况下,如果 lua 5.1 或更高版本被编译为 C++,它将使用 C++ 异常来展开堆栈而不是 longjmp/setjmp,尽管这是可配置的(在编译时)。请参阅 LUAI_THROW/LUAI_TRY 附近的 luaconf.h 以获取对此的讨论。
关于c++ - 在 C++ 中嵌入 Lua : linkage problems (liblua5. 1.a),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4913571/