linux下关于so出现的一个奇怪问题
首先是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