免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2307 | 回复: 4

郁闷了,可能是多重继承引起的问题 [复制链接]

论坛徽章:
0
发表于 2008-12-11 17:34 |显示全部楼层
10可用积分
先贴代码
class CIMtext:public CProtocol,public CMISC
{
        public:
                CIMtext(CSock *sock):CProtocol(sock),CMISC()
                {
                        counter = 0;
                }

                ~CIMtext()
                {}

                static bool MatchProtocol(CSock *sock);
                int Parse(void);
        private:


                static vector<IMKeyVal *>::iterator it; //关键字索引

                unsigned int counter;           //记录该对象已经Pare的次数,超过一定数值将。

                bool MatchSendFlag(IdxKeeper *idk,string &data);
                bool MatchRecvFlag(IdxKeeper *idk,string &data);
                bool MatchLoginFlag(IdxKeeper *idk,string &data);
                bool MatchTryLoginFlag(IdxKeeper *idk,string &data);
                bool MatchLogoutFlag(IdxKeeper *idk,string &data);
                bool MatchSwitchFlag(IdxKeeper *idk,string &data);
                bool GetSendInfo(IdxKeeper *idk,string &data);
                bool GetRecvInfo(IdxKeeper *idk,string &data);
                bool GetLoginInfo(IdxKeeper *idk,string &data);
                bool GetTryLoginInfo(IdxKeeper *idk,string &data);
                bool GetLogoutInfo(IdxKeeper *idk,string &data);
                bool GetSwitchInfo(IdxKeeper *idk,string &data);
                bool NeedDrop(void);
};



如上类 CIMtext继承CProtocol和CMISC,构造函数明确的给出了。

我把该代码编译成so库,在别的代码动态打开so库。编译参数为g++ -shared -o libcap.so  xxxxxxxx
编译过程没有问题。
但是运行时dlopen报错:     dlopen() error: ./libcap.so: undefined symbol: _ZN7CIMtext2itE

nm libcap.so后输出的相关信息为:
# nm libcap.so |grep CIMtext
0004c916 t _GLOBAL__I__ZN7CIMtext13MatchProtocolEP5CSock
0004bd70 T _ZN7CIMtext11GetRecvInfoEP9IdxKeeperRSs
0004ba28 T _ZN7CIMtext11GetSendInfoEP9IdxKeeperRSs
0004c0b8 T _ZN7CIMtext12GetLoginInfoEP9IdxKeeperRSs
0004c448 T _ZN7CIMtext13GetLogoutInfoEP9IdxKeeperRSs
0004c670 T _ZN7CIMtext13GetSwitchInfoEP9IdxKeeperRSs
0004a8e8 T _ZN7CIMtext13MatchProtocolEP5CSock
0004b6d8 T _ZN7CIMtext13MatchRecvFlagEP9IdxKeeperRSs
0004b598 T _ZN7CIMtext13MatchSendFlagEP9IdxKeeperRSs
0004b818 T _ZN7CIMtext14MatchLoginFlagEP9IdxKeeperRSs
0004c320 T _ZN7CIMtext15GetTryLoginInfoEP9IdxKeeperRSs
0004b920 T _ZN7CIMtext15MatchLogoutFlagEP9IdxKeeperRSs
0004b9a4 T _ZN7CIMtext15MatchSwitchFlagEP9IdxKeeperRSs
0004b89c T _ZN7CIMtext17MatchTryLoginFlagEP9IdxKeeperRSs
         U _ZN7CIMtext2itE
0004b04a T _ZN7CIMtext5ParseEv
0004b54a T _ZN7CIMtext8NeedDropEv
0003eadc W _ZN7CIMtextC1EP5CSock
0004cc7c W _ZN7CIMtextD0Ev
0004cc2e W _ZN7CIMtextD1Ev
00093a60 V _ZTI7CIMtext
00071eb8 V _ZTS7CIMtext
00093a38 V _ZTV7CIMtext[/code]


问题是:
1  红色部分应当不是构造函数的smbol,那它是什么?
2 是不是CIMtext类中的static成员it引起的这种问题?因为从   _ZN7CIMtext2itE看应该是个CIMtext(it) 样子的函数.

最佳答案

查看完整内容

static vector::iterator it; 没有定义一般类似struct foo{ static TYPE bar;};在 .cpp 文件要定义barTYPE foo::bar = ...;

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2008-12-11 17:34 |显示全部楼层
static vector<IMKeyVal *>::iterator it; 没有定义

一般类似
struct foo
{
    static TYPE bar;
};
在 .cpp 文件要定义bar
TYPE foo::bar = ...;

论坛徽章:
0
发表于 2008-12-11 19:21 |显示全部楼层
楼主可以去查一下类模板中的静态成员

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2008-12-11 19:30 |显示全部楼层
1. dlopen 是C接口, 你不能直接找C++的东西,
     C++ 和C的symbol 是不同的。所以它肯定找不到地址。
2. 你可以直接使用so库的东西,没必要使用dlopen,
3. 如果你非要使用,那么最好提供一个C接口,将对象的地址引出来,然后再使用。

论坛徽章:
0
发表于 2008-12-12 16:20 |显示全部楼层
谢谢楼上几位,问题的确是static 成员未在外部定义引起的。与4楼说的原因没关系。
看来自己C++基础还是太差。
就此结贴吧。谢谢大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP