将C编译为C++链接器错误(lua和oolua)
Compiling C as C++ linker error (lua and oolua)
我有一段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++链接,篡改是错误的,并且会收到很多关于丢失符号的链接器错误。
- C++Lua用户数据扰乱了Mathfu浮点值
- 使用 LuaBridge 或 Lua 将对象传递给 Lua 函数C++
- 将 Lua 函数块转换为 C 字符串
- 我可以从 lua 5.0.2 加载用 c++ 编写的 lua 5.3.5 dll 吗?
- 使用 lua 协程 API 和lua_close时出现分段错误
- 使用 C++ 自动 Lua 绑定
- 调用 lua 函数的地址为 C/C++?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- 如何将 Lua 添加到C++项目
- 使用 Lua 中的C++库对象
- 如何在C++中将用户数据从一个 Lua 块传递到另一个块
- 如何使用重新定义的打印函数打印Lua表?
- Lua table in C++ dll
- 在运行时环境中使用 C++ w/ Lua
- 将shared_ptr传递给Lua
- luaL_len is missing in Lua 5.1
- 将向量传递给<struct> Lua 表
- 将 Lua 与 C++ DLL 结合使用
- Lua C API - 从C++分配和使用类的对象成员
- 将C编译为C++链接器错误(lua和oolua)