在C ++中嵌入Lua:链接问题(liblua5.1.a)

时间:2011-02-06 13:26:51

标签: c++ c lua ld

我在一个C ++应用程序中嵌入了Lua,我收到了以下链接错误:

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

任何人都知道为什么会发生这些错误,以及如何修复它们?

2 个答案:

答案 0 :(得分:2)

http://lua-users.org/wiki/BuildingLua

有一个注释:

关于在C ++应用程序中嵌入Lua的注意事项

请注意,Lua是ANSI C的干净子集,可以编译为C或C ++。 Lua头文件中没有{#ifdef __cplusplus extern“C”{#endif ... Lua header ... #ifdef __cplusplus} #endif},因此只需更改名称即可将lua编译为C或C ++文件,无需对文件内容进行任何更改。

如果将lua编译为C库(这是典型的预打包二进制文件),为了将Lua嵌入到C ++应用程序中(即链接C到C ++),您必须将extern“C”放在包含C ++应用程序中的Lua头文件,例如

extern "C" {
#include "lua.h"
}

如果不这样做,可能会因为C ++名称错误而导致链接错误。

请不要在邮件列表上抱怨这一点。 :-)花时间搜索邮件列表,因为之前已经多次覆盖过。

可以说,如果你正在分发库的预先打包的二进制文件,那么你已经将lua核心编译为C(最有可能)或C ++,如果你将lua编译为C,你应该修改lua标题表示这一点。但是,作者不建议使用lua的预构建库,他们建议直接将lua源合并到您的应用程序中。有关讨论,请参阅BuildingModules(页面末尾)。

默认情况下,如果将lua 5.1或更高版本编译为C ++,它将使用C ++异常来展开堆栈而不是longjmp / setjmp,尽管这是可配置的(在编译时)。有关此内容的讨论,请参阅LUAI_THROW / LUAI_TRY附近的luaconf.h。

答案 1 :(得分:1)

您可以在c ++源代码中包含lua.hpp