我遇到了一段编译为C ++的C代码,从第3个包中产生链接器错误。
设置是我有lua,oolua和我的程序,利用这两个。由于其可怕的构建过程,该项目已从luabind迁移。我的代码偶尔会在构造一个对象时抛出异常(这是预期的),并且oolua不处理这个错误。
从阅读中我已经完成了编译lua,因为C ++应该缓解这个问题,并导致程序不仅仅是退出,但问题是oolua不喜欢lua因为某种原因而成为C ++,我找不到为什么这样做可能是。
tl; dr:如果C代码被编译为C ++,那么链接假设它正确编译会出现什么问题?
答案 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"
链接,修改错误并且您会收到许多关于缺少符号的链接器错误。