Skip to content
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()
{
}
Clone this wiki locally