当前位置:  技术问答>linux和unix

头疼了N天了,求高人指点,linux下如何编写C++共享库?

    来源: 互联网  发布时间:2016-02-26

    本文导语:  由于考虑到以后代码的后期改动,本人想建立一个共享库mylib.so,用来给我的游戏算积分。代码如下: //gamescore.cpp #include  #include "user.h" int     GameScore(CUser *pstUserInfo, int iRoadID) { if(pstUserInfo==NULL) { printf("%s:%d->u...

由于考虑到以后代码的后期改动,本人想建立一个共享库mylib.so,用来给我的游戏算积分。代码如下:
//gamescore.cpp
#include 
#include "user.h"

int     GameScore(CUser *pstUserInfo, int iRoadID)
{
if(pstUserInfo==NULL)
{
printf("%s:%d->user info is nulln",__FILE__,__LINE__);
return -1;
}
pstUserInfo->m_stBaseInfo.m_dwExperience=10;
pstUserInfo->m_stBaseInfo.m_dwScore=11;
return 0;
}
以上代码中用到了C++的一个类CUser,传给积分函数用来修改积分。
用g++ -shared -fPIC -o gamescore.so -g gamescore.cpp
可以生成共享库gamescore.so。但是在如下的动态库调用主程序中,出现了问题(编译没问题,运行时出问题,找不到symbol)
//game.cpp
#include 
#include 
#include 
#include 
#include 

#define SHARED /* 定义宏,确认共享,以便引用动态函数 */
#include "gamedll.h"

#define SOFILE "./gamescore.so" /* 指定动态链接库名称 */

void dll_init()
{
    void *dp;
    char *error;
    
    dp=dlopen(SOFILE,RTLD_LAZY);
    
    if(dp == NULL)
    {
     fprintf (stderr, "%sn", dlerror());
     exit(0);
    }
    
    GameScore =(int (*)(CUser*, int))dlsym(dp,"GameScore");
    
    error=dlerror(); /* 检测错误 */
    if (error) /* 若出错则退出 */
    {
        perror("dlsym GameScore errorn");
        printf("Error: %s",error);
        exit(1);
    }
 
}

main()
{
    CUser *pstUser= new CUser;
    
    dll_init();
    GameScore(pstUser,0);
    
    printf("pstUser->m_dwExperience= %d,pstUser->loser_point = %dn",pstUser->m_stBaseInfo.m_dwExperience,
        pstUser->m_stBaseInfo.m_dwScore);
    delete pstUser;
}
    
//gamedll.h如下:********************************
#ifndef _GAMEDLL_H_
#define _GAMEDLL_H_

#include "user.h"

#ifdef  SHARED
int     (*GameScore)(CUser *pstUserInfo, int iRoadID);
#else
int     GameScore(CUser *pstUserInfo, int iRoadID);
#endif
#endif


说明:在redhat linux我的代码编译都没有问题(如果各位有的话,可能是我贴代码的时候有笔误),能生产gamescore.so,主程序也能通过!(用g++ -rdynamic -s -ld选项正确编译),但是在运行后:
[cjp@gameserver1 gamescore]$ ./game
dlsym GameScore error
: Success
Error: ./gamescore.so: undefined symbol: gamescore[cjp@gameserver1 gamescore]$
找不到so里面的symbol????!!!

我是照着网上流行一个用c语言来实现共享库的例子改造的!gcc下,按他的例子没问题,该成g++以后问题就一样了。
后来,我查了一些资料,说要加入:
 #ifdef __cplusplus 
   extern "C" { 
   #endif 
   #ifdef __cplusplus 
   } 
#endif
来实现,但是像我这种应用,我非得要传入一个C++的类指针(或者说我一定要用C++来实现共享库),我该怎么办呢?
  请高手不吝赐教!给分100,不要嫌少!关键教导我怎样做C++共享库,我将终身收益!感激不尽!

|
根据你的代码,我改了一个地方,可以运行通过了。

关键在于在mylib.c里加上
extern "C" int GameScore(CUser*, int);

这样生成so的时候才会生成C风格的symbol,否则就会生成C++的类似_Z9GameScoreP5CUseri这样的名字。



    
 
 

您可能感兴趣的文章:

  • linux下C++动态malloc申请内存出现问题,高人指点一下,在线
  • linux下如何执行project文件,高人指点。
  • 求高人指点,网络编程
  • 嵌入式如何入门,求高人指点!!!
  • 请高人指点,busybox使用不同链接名实现不同功能的原理?
  • FireFox在Linux如何编译?哪位高人能否指点一下。
  • 想学习linux嵌入式开发,具体买什么开发板,请高人指点?
  • 请高人指点,查找服务器的文件.cfg
  • VisulSourseSafe是什么东西啊,那位高人指点一下???
  • shm_open()调用失败,希望高人指点!
  • 急!请高人指点
  • nat问题 求教,望高人指点
  • 加载自己写的驱动出问题了,求高人指点
  • ●●●看了个脚本,${mydomain:-"xk.com"} 不懂,哪位高人可否指点●●●
  • 高人指点:如何取得正在编辑的表格的CellEditor的行列号?
  • ioctl返回的地址问题?初学者,高人指点。
  • 关于linux的脚本运行。。。求高人指点
  • redhat9.0启动到输入用户名(字符方式)时系统马上自动休眠,高人指点!!100分
  • 高人给指点一把
  • 请高人指点:在unix下,如何实现二值信号量
  • 关于javabean的疑惑,请高人指点:
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 懂EJB的高人救救我!
  • 高分请教各位高人!!!!
  • 各位高人,请问在SCOUNIX下怎样使用USB设备呀,比如说鼠标
  • 各位高人 help
  • 各位Shell高人,如何取得Shell的第10个入口参数?$10不行啊,急!
  • solaris下一个编译错误~请高人解答
  • 求各位高人 UBOOT!
  • 用GTK+怎么让treeview控件带上背景图片?哪位高人给个思路?
  • 请各位高人指教。。。。急。。。
  • 哪位高人能够向我推荐一本如何学习linux编程的书籍,谢谢!
  • 请教各位高人,我的一个JAVA小程序中为何会出现Class GirdLayout not found.
  • 那位高人有任务分配问题的禁忌搜索算法、模拟退火算法的算法实现程序啊
  • 表的显示问题,请高人回答
  • 安装solaris 10出现问题,向高人求救,谢谢
  • eclipse 连接Liunx CVS问题 !高人救命啊!
  • 请教高人,在unix中怎样使一般进程暂时获得管理员的权限,急!!谢谢
  • 那位高人能提供关于Jbuilder的学习教材下载!!!!!急急急!!!!!
  • 急,了解AICC标准的高人出招吧!
  • 各位linux高人
  • 关于jsp开发,请教高人!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3