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

时间:2012-12-04 01:25:39

标签: c++ c lua oolua

我遇到了一段编译为C ++的C代码,从第3个包中产生链接器错误。

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

从阅读中我已经完成了编译lua,因为C ++应该缓解这个问题,并导致程序不仅仅是退出,但问题是oolua不喜欢lua因为某种原因而成为C ++,我找不到为什么这样做可能是。

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

1 个答案:

答案 0 :(得分:4)

当Lua编译为C ++时,它实际上使用C ++名称修改,而C ++应该使用普通的头文件。不要被lua.hpp标题混淆。当Lua编译为C时,这应仅用于C ++。因此,当您将Lua编译为C ++时,您应该使用extern "C"。不幸的是,OOLua确实使用了extern "C" here。您可以尝试修改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 ++时,没有外部语句,因此编译器假定Lua中的所有函数都是extern "C++"。您不能再直接从C使用Lua。如果您使用来自C ++的Lua和lua.hpp,那么它会看到extern "C"块,假设Lua函数是extern "C"并且在链接时失败,因为错误的整理。如果您直接使用C ++中的常规标题,则没有外部语句,因此假设为extern "C++"。这匹配库,一切正常。

OOLua的作用是包含普通标题,但它周围有自己的extern "C"所以编译器在所有Lua函数实际使用C ++链接时使用extern "C"链接,修改错误并且您会收到许多关于缺少符号的链接器错误。