linux下关于so出现的一个奇怪问题

yym314 2008-10-15 10:15:28
首先是so的源代码,so有两个文件so.h和so.cpp,代码如下
///////////////////////////////////////////////////////////
//so.h的源代码
///////////////////////////////////////////////////////////
#ifndef _SO___H__
#define _SO___H__
class CSo
{
public:
static CSo* CreateSoOBJ( void );
void SoTest( int iVal );
};
#endif //_SO___H__

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

class CA //注意这个CA类
{
public:
void Fun( void )
{
printf("<<so>> CA::Fun( void )\r\n");
}
};

CSo* CSo::CreateSoOBJ( void )
{
printf("<<so>> CSo::CreateSoOBJ( void )\r\n");
return new CSo();
}

void CSo::SoTest( int iVal )
{
printf("<<so>> 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 //注意这个CA类
{
public:
void Fun( void )
{
printf("<<exe>> CA::Fun( void )\r\n");
}
};

int main()
{
printf("<<exe>> start\r\n");

CA ca;
ca.Fun();

printf("<<exe>> use so\r\n");
CSo* pso=CSo::CreateSoOBJ();
pso->SoTest( 14 );

printf("<<exe>> 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










...全文
190 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
once_and_again 2008-10-17
  • 打赏
  • 举报
回复
功能相同,或者相关 的类,函数,放在同一个命名空间
快乐田伯光 2008-10-16
  • 打赏
  • 举报
回复
C++不怎么熟,
void CSo::SoTest( int iVal )
{
printf(" < <so>> CSo::SoTest( int iVal )\r\n");

CA ca;
ca.Fun();

}

实现这功能为什么要去不定义ca?直接Fun()不可以吗?

要么就给自己定义的库建一个单独的命名空间,那样,想要调用那个库的接口就用命名空间来限定。
yym314 2008-10-16
  • 打赏
  • 举报
回复
我这里是为了描述这个问题才取了完全相同的名称
如果我的程序要以一个so提供给别人使用的话,不可避免的出现相同类名的情况的啊
我在windows下测试了这个问题,发送windows下是没问题的.
我怀疑是不是我什么编译选项没有设置正确啊?
帅得不敢出门 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yym314 的回复:]
我这里是为了描述这个问题才取了完全相同的名称
如果我的程序要以一个so提供给别人使用的话,不可避免的出现相同类名的情况的啊
我在windows下测试了这个问题,发送windows下是没问题的.
我怀疑是不是我什么编译选项没有设置正确啊?
[/Quote]
应该是在调用时匹配了代码调用处当前文件中的那个Fun()了, 就近原则吧,从本域开始查找,找不到再跳出这个域查找

======如果我的程序要以一个so提供给别人使用的话,不可避免的出现相同类名的情况的啊

对于这个问题,那就是用命名空间了 命名空间就是用来解决大项目中,出现相同名字的问题
joyself 2008-10-15
  • 打赏
  • 举报
回复
这个应该就叫 “命名空间污染”吧。

我不明白你为什么要去相同的类名呢?
yym314 2008-10-15
  • 打赏
  • 举报
回复
在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????

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧