2

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

设置是我有 lua、oolua 和我的程序,它利用了这两者。由于其可怕的构建过程,该项目已从 luabind 移出。我的代码在构造对象时偶尔会抛出异常(这是意料之中的),而 oolua 不会处理这个错误。

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

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

4

1 回答 1

5

当 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"

于 2012-12-04T03:34:38.940 回答