- 论坛徽章:
- 0
|
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???? |
|