调用未知类库中的函数

我有几个在C++源代码中定义的类库。我的问题是每当一个库被删除或新的库被添加时,必须有一些东西调用库的“初始化”函数。

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

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

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

编辑:我没有使用DLL或SO,一切都被编译成一个可移植的可执行文件。

注意:我在项目设计/管理方面没有很多经验。我希望听到关于我的方法的意见和建议。

点赞
用户5129715
用户5129715

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

 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/共享对象中,并具有一组定义良好的插槽,执行有用的功能。

例如

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 ) {}

};
2017-08-27 07:52:16