可以在Lua中加载C++dll文件吗

Can a C++ dll file be loaded in Lua?

本文关键字:C++dll 文件 加载 Lua      更新时间:2023-10-16

我需要在Lua中加载一个DLL文件来连接不同的API。我知道可以加载C类型的dll,但我有一个用C++生成的dll文件。

产生这个库的代码(C++)的形式是:

// MyAPI.h
namespace MyAPI
{
    public class MyFirstClass
    {
        public: 
           MyFirstClass();
           void performSomeMethod(int arg);
    }
}

然后产生dll文件CCD_ 1。当我现在尝试在Lua中导入这个时,使用:

require "MyAPI"

它立即给出错误:CCD_ 2。我不明白这意味着什么,也不知道如何摆脱它。Lua是否可以不包括C++库(即,我应该写另一个C包装器吗?)或者有办法做到这一点吗?

是的,可以做到。公开一个C函数加载程序luaopen_MyAPI,您可以在其中调用使用任何类型的C++Lua Wrapper的函数,如LuaBridge、LuaBind或其他函数。如果您在C++中的调用不符合绑定的规则,例如生存期管理、按值传递对象等,您可能需要将这些类包装成可绑定的类。

例如,参见pugilua

  • pugilua_lib.h-模块加载器API
  • pugilua_lib.cpp-包装类和LuaBridge绑定
  • pugilua.cpp-从模块加载程序调用绑定

您需要导出一个名为luaopen_ MyAPI的C函数,该函数遵循C-Lua API。其余的代码可以是C++。

我的理解是,您需要一个带有C入口点而不是C++入口点的C包装器。C++进行名称篡改,因此它可以根据编译器以及方法签名等动态更改。

以下是Lua-to-C调用的解剖,您可能会发现它很有用。

另请参阅关于dll加载的堆栈溢出讨论。

这里是另一个关于require和dll加载的堆栈溢出讨论。

这是一篇关于名称篡改问题的简短文章。