当 Lua 编译为 C++ 时,它实际上使用了 C++ 名称修饰,并且 C++ 应该使用正常的头文件。不要被lua.hpp
标题弄糊涂了。只有当 Lua 被编译为 C 时,它才应该用于 C++。因此,当你将 Lua 编译为 C++ 时,你不应该使用extern "C"
. 不幸的是 OOLua 在extern "C"
这里使用。您可以尝试将 OOLua 中的标头修改为不使用extern "C"
,然后重新编译 OOLua 或向他们提交错误以正确修复它。
不幸的是,似乎没有多少人意识到将 Lua 与 C++ 一起使用的陷阱,所以许多项目都假设 Lua 像正常一样编译为 C。
长解释:
当 Lua 编译为 C 时,没有 extern 语句,因此所有函数都使用默认值 ( extern "C"
)。当 C 文件使用 Lua 时,它们使用正常的头文件,这些头文件再次不包含 extern 语句,因此编译器假定一切都是如此,extern "C"
并且它们都与库匹配。如果您使用 C++ 中的 Lua,则使用lua.hpp
包含该extern "C"
块的 Lua,以便您的编译器知道 Lua 是extern "C"
.
当 Lua 编译为 C++ 时,没有 extern 语句,因此编译器假定 Lua 中的所有函数都是extern "C++"
. 您不能再直接从 C 中使用 Lua。如果您使用 C++ 中的 Lua,lua.hpp
那么它会看到该extern "C"
块,假定 Lua 函数extern "C"
在链接时由于错误的处理而失败。extern "C++"
如果您直接从 C++ 使用普通标头,则假定没有 extern 语句。这与图书馆相匹配,一切正常。
OOLua 所做的是它包含正常的头文件,但它有自己的头文件,因此当所有 Lua 函数实际上使用 C++ 链接时,extern "C"
编译器会为所有 Lua 函数使用链接,修改错误并且您会收到很多关于缺少符号的链接器错误。extern "C"