中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
编写共享库的注意事项
作者:未知 时间:2005-09-13 23:28 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:编写共享库的注意事项
linux下的共享库是一项让人激动的技术,可以利用它充分提高系统的扩展能力,如插件式设计,个人认为它比windows的动态链接库功能更强大。以下是我在开发共享库经过一番折磨总结的需要注意的几点,仅做自勉。

1、共享库的对外接口函数的声明必须加上extern “C”
2、使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。

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

主执行程序:main.cpp

#include <iostream>
#include <dlfcn.h>
#include "SMSGamePlugin.h"

int main(int argc, char** argv)
{
void *GameLib = dlopen("./Flower.so", RTLD_LAZY);
const char *dlError = dlerror();
if (dlError)
{
std::cout << "dlopen error!" << dlError << std::endl;
return(-1);
}
CSMSGamePlugin *(*pGetGameObject)(void);
pGetGameObject = (CSMSGamePlugin *(*)(void))dlsym(GameLib, "GetGameObject");
dlError = dlerror();
if (dlError)
{
std::cout << "dlsym error!" << dlError << std::endl;
return(-1);
}
CSMSGamePlugin *pGame = (*pGetGameObject)();
pGame->Initialize();
pGame->Load();
pGame->Handle();
delete *pGame;
dlclose(GameLib);
}

公用基类部分: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

共享库部分:

共享库头文件: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

共享库实现文件:Flower.cpp

#include <iostream>
#include "Flower.h"

CSMSGamePlugin *GetGameObject(void)
{
return(new CFlower());
}

int CFlower::Initialize(void)
{
std::cout << "Initialize()" << std::endl;
return(0);
}

int CFlower::Load(void)
{
std::cout << "Load()" << std::endl;
return(0);
}

int CFlower::Handle(void)
{
std::cout << "Handle()" << std::endl;
return(0);
}

编译g++ -c Flower.cpp
g++ -shared -o Flower.so

注意如果不加extern "C"编译后运行时就会提示:
dlsym error!./Test: undefined symbol: GetGameObject

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有