免费注册 查看新帖 |

Chinaunix

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

[C++] linux下关于so出现的一个奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-15 22:33 |只看该作者 |倒序浏览
5可用积分
首先是so的源代码,so有两个文件so.h和so.cpp,代码如下
///////////////////////////////////////////////////////////
//so.h的源代码
///////////////////////////////////////////////////////////
#ifndef _SO___H__
#define _SO___H__

class CSo
{
public:
    static CSo* CreateSoOBJ( void );
   
public:
    void SoTest( int iVal );   
};

#endif //_SO___H__



///////////////////////////////////////////////////////////
//so.cpp的源代码
///////////////////////////////////////////////////////////
#include "stdio.h"
#include "so.h"

class CA
{   
public:
    void Fun( void )
    {
    printf("<> CA::Fun( void )\r\n");
    }
};

CSo* CSo::CreateSoOBJ( void )
{
    printf("<> CSo::CreateSoOBJ( void )\r\n");
    return new CSo();
}
   
void CSo::SoTest( int iVal )
{
    printf("<> CSo::SoTest( int iVal )\r\n");
   
    CA ca;
    ca.Fun();
}


///////////////////////////////////////////////////////////
//so的make文件
///////////////////////////////////////////////////////////
all: proj

proj: so.o
    g++ -shared so.o -o libSo.so -lpthread -lrt -ldl

so.o:
    g++ -c -g -fpic so.cpp -o so.o

clean:
    rm -f so.o
    rm -f libSo.so



///////////////////////////////////////////////////////////
上面是so的所有代码,在编译之后会生成一个libSo.so
然后是使用so的exe源代码,exe只有exe.cpp一个文件

///////////////////////////////////////////////////////////
//exe.cpp的源代码
///////////////////////////////////////////////////////////
#include <stdio.h>
#include <unistd.h>
#include "so.h"

class CA
{   
public:
    void Fun( void )
    {
        printf("<> CA::Fun( void )\r\n");
    }
};

int main()
{
    printf("<> start\r\n");
   
    CA ca;
    ca.Fun();
   
    printf("<> use so\r\n");
    CSo* pso=CSo::CreateSoOBJ();
    pso->SoTest( 14 );
   
    printf("<> end\r\n");
    return 1;
}

///////////////////////////////////////////////////////////
//exe的make文件
///////////////////////////////////////////////////////////
all: proj

proj: exe.o
    g++ exe.o -o exe -L./ -lpthread -lrt -ldl -lSo

exe.o:
    g++ -c -g -fpic exe.cpp -o exe.o

clean:
    rm -f exe.o
    rm -f exe


///////////////////////////////////////////////////////////
我在生成libSo.so之后将libSo.so和so.h拷贝到exe所在的目录下(和so的目录不同)
编译exe,生成exe可执行程序,运行exe其结果为:
< <exe>> start
< <exe>> CA::Fun( void )
< <exe>> use so
< <so>> CSo::CreateSoOBJ( void )
< <so>> CSo::SoTest( int iVal )
< <exe>> CA::Fun( void ) //奇怪?应该输出 < <so>> CA::Fun( void )才正确啊!
< <exe>> end




在so中有一个class CA,并有一个Fun接口
同样的exe中也有个class CA,并也有一个Fun接口,这两个Fun接口的实现是不一样的,有不同的输出.
现在的问题是,对于倒数第二行的输出是调用pso->SoTest,然后在SoTest中调用CA::Fun而产生的
我的想法是,这里应该调用so中的CA类中的Fun才正确(输出 < <so>> CA::Fun( void )),而这里居然调用到了exe中的CA类中的Fun.为什么啊?
如何才能使倒数第二行的输出 < <so>> CA::Fun( void )?(也就是调用so中的CA的Fun????

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP