在库的未知类中调用函数

时间:2017-08-26 22:45:30

标签: c++ lua

我在C ++源代码中定义了一些库。我的问题是每当删除一个库或添加一个新库时,都必须调用库“Initialize”函数。

一个例子是:一个名为CLuaNet的网络套接字类,它有一个名为CLuaNet :: Initialize(* State);的函数。如何在我的项目中调用此函数,因为我无法预测库名称?如果可能的话,我希望这个“链接”在编译时完成,就像宏。

每当打开Lua环境的新实例时,必须以Lua状态作为参数调用每个库的initialize函数。

该项目在不同的体系结构(X86 / X64 / ARMv6 / ARMv7)和操作系统上运行,为每个可能的平台和操作系统组合制作编译库是不可行的(Windows - DLL,Linux - SO等)。这是一个服务器应用程序。

编辑:我没有使用DLL或SO - 所有内容都编译成一个可执行文件以便于移植。

  

注意:我在项目设计/管理方面没有太多经验。 ID   我喜欢听取有关我的方法的意见和建议。

1 个答案:

答案 0 :(得分:0)

处理名称查找的常规机制是创建另一个名称很好的函数,该函数返回足够的元数据以允许您调用它。

 extern "C" DLLEXPORT const MetaInfo & InfoFunction() 
 {
     static MetaInfo luaNet(
               CLuaNet::Initialize,
               CLuaNet::Finalize,
               CLuaNet::SomethingElse );
     return luaNet; // Give main application information on how to call me

 }

其中DLLEXPORT声明要从DLL /共享对象导出的函数。

MetaInfo被编译到DLL /共享对象中,并有一组定义良好的插槽,可执行有用的功能。

e.g。

struct MetaInfo {
     int (*initializeFunction)( lua_State * L );
     int (*closeFunction)( lua_State * L );
     int (*utilityFunction)( lua_State* L );
     MetaInfo( int (*)(lua_State *) init,
               int (*)( lua_State*) fini,
               int (*)( lua_State*) other ) :
              initializeFunction( init),
              closeFunction( fini ),
              utilityFunction( other ) {}

};