我在C ++源代码中定义了一些库。我的问题是每当删除一个库或添加一个新库时,都必须调用库“Initialize”函数。
一个例子是:一个名为CLuaNet的网络套接字类,它有一个名为CLuaNet :: Initialize(* State);的函数。如何在我的项目中调用此函数,因为我无法预测库名称?如果可能的话,我希望这个“链接”在编译时完成,就像宏。
每当打开Lua环境的新实例时,必须以Lua状态作为参数调用每个库的initialize函数。
该项目在不同的体系结构(X86 / X64 / ARMv6 / ARMv7)和操作系统上运行,为每个可能的平台和操作系统组合制作编译库是不可行的(Windows - DLL,Linux - SO等)。这是一个服务器应用程序。
编辑:我没有使用DLL或SO - 所有内容都编译成一个可执行文件以便于移植。
注意:我在项目设计/管理方面没有太多经验。 ID 我喜欢听取有关我的方法的意见和建议。
答案 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 ) {}
};