将 C 编译为 C++ 链接器错误(lua 和 oolua)

KGa*_*oir 2 c c++ lua oolua

我在处理一段 C 代码时遇到问题,该代码编译为 C++,从第三个包中产生链接器错误。

设置是我有 lua、oolua 和使用这两个的我的程序。由于其可怕的构建过程,该项目已从 luabind 中移出。我的代码在构造对象时偶尔会抛出异常(这是预期的),并且 oolua 不处理此错误。

从阅读中我已经完成将 lua 编译为 C++ 应该可以缓解这个问题并导致程序不只是退出,但问题是 oolua 出于某种原因不喜欢 lua 是 C++,而且我找不到关于为什么会出现这种情况的参考资料。

tl;dr:如果 C 代码被编译为 C++,假设编译正确,链接时可能会出现什么问题?

Joh*_*342 5

当 Lua 被编译为 C++ 时,它实际上使用 C++ 名称修饰,并且 C++ 应该使用正常的头文件。不要被lua.hpp标题所迷惑。当 Lua 编译为 C 时,它只能用于 C++。因此,当你将 Lua 编译为 C++ 时,你不应该使用extern "C". extern "C" 不幸的是 OOLua 确实在这里使用。您可以尝试修改 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 是extern "C".

当 Lua 被编译为 C++ 时,没有 extern 语句,因此编译器假定 Lua 中的所有函数都是extern "C++". 你不能再直接从 C 使用 Lua。如果你从 C++ 使用 Lua,那么lua.hpp它会看到该extern "C"块,假设 Lua 函数是extern "C",并且由于错误的修饰而在链接时失败。extern "C++"如果直接使用 C++ 中的普通标头,则假定没有 extern 语句。这与库匹配,一切正常。

OOLua 所做的是它包含普通的标头,但有自己的extern "C"标头,因此编译器extern "C"对所有 Lua 函数使用链接,而实际上它们使用 C++ 链接,重整是错误的,并且您会收到许多有关缺少符号的链接器错误。