-
Notifications
You must be signed in to change notification settings - Fork 150
StaticLibPlugin
Zhang Yungui edited this page Feb 4, 2012
·
3 revisions
对于动态库形式的插件,在运行时动态加载这些插件文件,一个插件可以供多个软件使用。有时还需要静态库形式,发布软件时只需要一个主程序文件,在内部则是由多个静态库模块组成,这样既能发挥插件的可重用优点,又能减少程序文件数量。
source/example/libpln1 是静态库插件例子,与动态库插件的主要区别是:
- 工程类型为静态库,输出文件为
*.lib 或 *.a
- 有
_LIB
的预处理定义 - 在 module.cpp 中不是用
XEND_DEFINE_MODULE_DLL()
,而是用XEND_DEFINE_MODULE_LIB
(工程名),例如XEND_DEFINE_MODULE_LIB(libpln1)
将定义一个全局常量classes_libpln1
- 静态库插件内不实现
x3InitializePlugin()
和x3UninitializePlugin()
source/example/libspln 是使用静态库插件的例子, consoledemo/main.cpp 中也有使用静态库插件的例子。
下面是使用多个静态库插件的一个动态库插件(或主程序)中的module.cpp例子。关键点有:定义XUSE_LIB_PLUGIN
;声明引用外部classes_libxxx
变量;将实现类组合在一起。
#include <module/plugininc.h>
#include <module/pluginimpl.h>
// 在包含modulemacro.h之前定义XUSE_LIB_PLUGIN,表示要使用静态库插件
#define XUSE_LIB_PLUGIN
#include <module/modulemacro.h>
#include "libspln.h" // 此动态库插件可以有自己的实现类
XBEGIN_DEFINE_MODULE()
XDEFINE_CLASSMAP_ENTRY(CSimple3) // 此动态库插件可以有自己的实现类
XEND_DEFINE_MODULE_DLL()
#ifdef _MSC_VER // VC++中可以直接指定LIB
#pragma comment(lib, "libpln1.lib")
#pragma comment(lib, "libpln2.lib")
#endif
// 这些外部classes_libname变量是在静态库插件中定义的
extern const x3::ClassEntry* const classes_libpln1;
extern const x3::ClassEntry* const classes_libpln2;
// 将此动态库插件与静态库插件的实现类组合在一起
const x3::ClassEntry* const x3::ClassEntry::classes[] = {
s_classes, classes_libpln1, classes_libpln2, NULL
};
OUTAPI bool x3InitializePlugin()
{
return true;
}
OUTAPI void x3UninitializePlugin()
{
}