zoukankan      html  css  js  c++  java
  • linux C++ 共享库导出类

    1.共享库的对外接口函数的声明必须加上extern “C”。

    2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。

    以下是一个插件式设计的示例:

    1、主执行程序:main.cpp

    #include

    #include

    #include "SMSGamePlugin.h"

    int main(int argc, char** argv)

    {

            void *GameLib = dlopen("./Flower.so", RTLD_LAZY);

            const char *dlError = dlerror();

             if (dlError)

            {

                   < "dlopen error!" << dlError <<

                    return(-1);

            }

            CSMSGamePlugin *(*pGetGameObject)(void);

            pGetGameObject = (CSMSGamePlugin *(*)(void))dlsym(GameLib, "GetGameObject");

            dlError = dlerror();

            if (dlError)

            {

                   < "dlsym error!" << dlError <<

                    return(-1);

            }

            CSMSGamePlugin *pGame = (*pGetGameObject)();

            pGame->Initialize();

            pGame->Load();

            pGame->Handle();

            delete *pGame;

            dlclose(GameLib);

    }

    2、公用基类部分:SMSGamePlugin.h

    #ifndef __SMSGamePlugin_h__

    #define __SMSGamePlugin_h

    class CSMSGamePlugin

    {

    public:

            virtual int Initialize(void) = 0;

            virtual int Load(void) = 0;

            virtual int Handle(void) = 0;

    };

    #endif

    编译:g++ -rdynamic -ldl -s -o Test main.cpp

    3、共享库部分:

    共享库头文件:Flower.h

    #ifndef __Flower_h__

    #define __Flower_h__

    #include "SMSGamePlugin.h"

    extern "C" CSMSGamePlugin *GetGameObject(void);

    class CFlower: public CSMSGamePlugin

    {

    public:

            virtual int Initialize(void);

            virtual int Load(void);

            virtual int Handle(void);

    };

    #endif

    4、共享库实现文件:Flower.cpp

    #include

    #include "Flower.h"

    CSMSGamePlugin *GetGameObject(void)

    {

            return(new CFlower());

    }

    int CFlower::Initialize(void)

    {

           < "Initialize()" <<

            return(0);

    }

    int CFlower::Load(void)

    {

           < "Load()" <<

            return(0);

    }

    int CFlower::Handle(void)

    {

           < "Handle()" <<

            return(0);

    }

    编译:

        g++ -c Flower.cpp

        g++ -shared -o Flower.so

    5、注意:

    如果不加extern "C"编译后运行时就会提示:

  • 相关阅读:
    跨DLL边界传递CRT对象的隐患(或诸如:HEAP[]: Invalid Address specified to RtlValidateHeap(#,#)问题出现的原因)
    【策略模式】不同的时间用不同的规则优先考虑策略模式
    【装饰模式】遵循开闭原则,使用一个类装饰另一个类
    【简单的工厂模式】一个简单的计算器
    【原】使用Golang语言编写echo程序
    WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)
    春运买票难,是谁造成的?
    搜狗输入法使用感受
    [原]在 go/golang语言中使用 google Protocol Buffer
    防护针对SQL Server数据库的SQL注入攻击
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/3671758.html
Copyright © 2011-2022 走看看