免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1435 | 回复: 4
打印 上一主题 下一主题

solaris编译动态库发生名字冲突 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-11 22:59 |只看该作者 |倒序浏览
进程A会顺序加载两个功能类似的动态库B和C,动态库的导出接口完全一样,为防止同一动态库被多次加载,每个动态库中都定义了一个全局指针,动态库加载前指针为NULL,代码示例:
//file A
CTaskA* pTask = NULL;

extern "C"
{
     DLLEXPORT CTaskA* NewTask(省略参数)
    {
         if (NULL == pTask)
         {
              pTask = new CTaskA(省略参数);
         }
         return pTask;
    }
}

//file B
CTaskB* pTask= NULL;

extern "C"
{
     DLLEXPORT CTaskB* NewTask(省略参数)
    {
         if (NULL == pTask)
         {
              pTask = new CTaskB(省略参数);
         }
         return pTask;
    }
}

上面CTaskA和CTaskB都是从同一个基类派生的,但请注意两个全局指针的名字是一样的,
编译时makefile增加了-KPIC 选项。实际运行时,动态库加载正常,但每次希望调用后被动态库的函数时都会调用成第一个被加载的动态库中的同名函数。

后来将全局指针的名字改成不一样的,问题解决,但不知是什么原因,请大侠留步,不胜感激

论坛徽章:
0
2 [报告]
发表于 2007-04-13 20:50 |只看该作者
忘了介绍环境,上述代码在windows下没有问题,但在sun V240 solaris10环境下存在刺问题,编译环境为solaris8, Sun workshop, CC 版本记不清了,不知道是否因为编译器的BUG

哪位大侠有知道原因的?

论坛徽章:
0
3 [报告]
发表于 2007-04-13 22:50 |只看该作者
放错地方了,转到c/c++板块去吧。

论坛徽章:
0
4 [报告]
发表于 2007-04-13 23:22 |只看该作者
C++也放了,有人推荐到这里555555

论坛徽章:
0
5 [报告]
发表于 2007-04-13 23:59 |只看该作者
呵呵,按理,C程序,编译都是C那一块的,为何会推荐到这里呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP