【问题标题】:Embedding Lua in C++: linkage problems (liblua5.1.a)在 C++ 中嵌入 Lua:链接问题 (liblua5.1.a)
【发布时间】:2011-02-06 13:26:50
【问题描述】:

我将 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

有人知道为什么会出现这些错误,以及如何解决这些错误吗?

【问题讨论】:

  • 这真的是完整的错误吗?如果您使用-Wl,-v-v(详细)选项传递给链接器会发生什么?似乎您可能缺少输入文件或符号或其他东西。
  • @Jefromi:你是对的。我应该添加 so 文件而不是静态存档文件。现在可以使用了

标签: c++ c lua ld


【解决方案1】:

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。

【讨论】:

  • 正确。还值得注意的是,lauxlib.hlualib.h 需要以相同的方式包含(如果需要)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多