sybase125+aix530,dlopen动态调用动态库失败
正在做一些移植工作,由32位平台sybase120+aix433移植到新平台:sybase12.5.4for4.3.3+aix5.3.0.0都是32位的,以下应用在sybase120+aix433中是正常运行的,但在新的平台就报错,我们的应用中有动态
调用动态库,应用(主要部分,都贴的太长了)如下:
extern intGetSN(char *pszSNType, char *pszHeadNo, char *pszSN);
main()
{
EXEC SQL BEGIN DECLARE SECTION;
char username;
char password;
char server;
EXEC SQL END DECLARE SECTION;
void* handle;
int (*fptr)(char*,char*,char*);
strcpy(username, "mbfe");
strcpy(password, "mbfe");
strcpy(server, "SYBASE");
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;
EXEC SQL USE ruccps;
if((handle=dlopen("/home/mbfe/lib/dll/app.so",RTLD_LAZY))==NULL)
{
printf("Open Dynamically Linked library app.so error.\n");
printf("error is %s\n",dlerror());
exit(1);
}
/*********** 调用动态库里的函数GetSN,里面就是select一个表的数据,然后附值 ************/
fptr=(int(*)(char*,char*,char*))dlsym(handle,"GetSN");
if(fptr==NULL)
{
printf("Call GetSN error.\n");
printf("error is %s\n",dlerror());
exit(1);
}
/************* 传入参数执行这个函数 *************/
nRet=(*fptr)(PS_CXSH,"",cxsh);
if (nRet == 0)
{
printf("cxsh:[%s]\n", &cxsh);
}
else
{
printf("error:[%d]\n", nRet);
printf("cause is %s\n",sqlca.sqlerrm.sqlerrmc);
}
/*
执行结果:cause is -33620275 cs_objects: cslib user api layer: external error: ZZZZZ cs_objects: error
performing requested operation.
*/
dlclose(handle);
/************* 单独调用动态库里的函数GetSN,不通过动态调用,结果正常,能取出数据 *************/
nRet = GetSN(PS_CXSH, "", cxsh);
if (nRet == 0)
{
printf("cxsh:[%s]\n", &cxsh);
}
else
{
printf("error:[%d]\n", nRet);
printf("cause is %s\n",sqlca.sqlerrm.sqlerrmc);
}
EXEC SQL DISCONNECT current;
}
这样看来是动态调用之前打开的数据库的作用范围没有作用用到动态链接库里去,后来试了一下,把打开库的动作
也加到了GetSN函数中,仍然是以上的动态调用,是可以的。
没有看过sybase调用的细节,是不是打开数据库的后的一些全局变量作用不到动态调用打开的动态链接库里,
也就是动态打开动态链接库之前的全局变量作用不到动态链接库里去?
还是别的什么原因,或者在125和53的平台下是否可以设置什么环境变量、调什么系统参数或者在makefile中加入
什么参数,能够解决上述问题的。
请高手们指教,谢谢了。 没有人能指点指点吗?是不是我发的不专业:(
页:
[1]