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

时间:2013-11-29 15:07:37

标签: c++ dll lua

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

生成此库的代码(在C ++中)的格式为:

// MyAPI.h

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

然后生成了dll文件MyAPI.dll。当我现在尝试在Lua中导入它时,使用:

require "MyAPI"

它会立即显示错误:error loading module 'MyAPI' from file '.\MyAPI.dll': The specified procedure could not be found。我不明白这意味着什么,或者如何摆脱它。一般来说,Lua不能包含C ++库(即我应该编写另一个C包装器吗?)还是有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

我的理解是你需要一个带有C入口点而不是C ++入口点的C包装器。 C ++确实命名为mangling,因此它可以根据编译器以及方法签名等动态更改。

以下是Anatomy of a Lua to C Call,您可能会觉得有帮助。

另见stack overflow discussion on what goes on with dll loading

这是另一个stack overflow discussion on require and dll loading

这是brief post on the name mangling problem

答案 2 :(得分:3)

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

有关示例,请参阅pugilua

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