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

Compiling C as C++ linker error (lua and oolua)

本文关键字:lua oolua 错误 编译 C++ 链接      更新时间:2023-10-16

我有一段C代码被编译为C++,在第三个包中产生链接器错误。

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

根据我所做的阅读,将lua编译为C++应该可以缓解这个问题,并导致程序不仅退出,但问题是,由于某种原因,oolua不喜欢lua是C++,我找不到为什么会这样。

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

当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 "C")。当C文件使用Lua时,它们使用普通的头文件,这些头文件同样不包含外部语句,因此编译器假设所有内容都是extern "C",并且都与库匹配。如果使用C++中的Lua,则使用包含extern "C"块的lua.hpp,这样编译器就知道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函数使用extern "C"链接,而实际上它们使用C++链接,篡改是错误的,并且会收到很多关于丢失符号的链接器错误。