- 论坛徽章:
- 0
|
我在AIX系统下主程序通过dlopen的方式动态调用子程序,主程序中打开了数据库,
如果将dlopen所在的函数编译成动态库,子程序能正常运行。
如果将dlopen所在函数编译成静态库,子程序中访问数据库报未打开数据库。
不知道是编译参数少了还是其他什么原因,请指教。
程序如下:
main.ec
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
EXEC SQL include sqlca;
#ifndef SQLCODE
#define SQLCODE sqlca.sqlcode
#endif
int main()
{
EXEC SQL BEGIN DECLARE SECTION;
char *dbname;
char s_rq[9];
EXEC SQL END DECLARE SECTION;
dbname = getenv("DBNAME");
EXEC SQL DATABASE :dbname;
if( SQLCODE ) {
printf("[%s-%d] [%d]\n",__FILE__,__LINE__,SQLCODE);
exit (-1);
}
EXEC SQL SELECT rq INTO :s_rq FROM table1;
if( SQLCODE ) {
printf("[%s-%d] [%d]\n",__FILE__,__LINE__,SQLCODE);
exit (-1);
}
printf("In main rq:[%s]\n",s_rq);
dllcall("libmytest.so","getrq");
EXEC SQL CLOSE DATABASE;
exit (0);
}
getrq.ec
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
EXEC SQL include sqlca;
int getrq()
{
EXEC SQL BEGIN DECLARE SECTION;
char s_rq[9];
EXEC SQL END DECLARE SECTION;
bzero(s_rq,sizeof(s_rq));
EXEC SQL SELECT rq INTO :s_rq FROM table1;
if( SQLCODE ) {
printf("[%s-%d] [%d]\n",__FILE__,__LINE__,SQLCODE);
return -1;
}
printf("In getrq: RQ:[%s]\n",s_rq);
return 0;
}
dllcall.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
int dllcall( char *dllname, char *funname )
{
void *handle;
int (*func)();
int ret;
if( (handle=dlopen(dllname,RTLD_LAZY)) == NULL ) {
printf("打开动态库失败!\n");
return (-1);
}
if( (func = (int (*)())dlsym(handle,funname)) == NULL ) {
printf("打开函数失败!\n");
return (-1);
}
ret = func();
dlclose(handle);
return ret;
}
makefile
all: libmytest.so libdll_a.a libdll.so a b
libdll.so:dlldrv.o
cc -G -bexpall -bnoentry -o $@ dlldrv.o
libdll_a.a:dlldrv.o
ar -urv $@ dlldrv.o
libmytest.so:getrq.o
esql -G -bexpall -bnoentry -o $@ getrq.o
a:main.o
esql -O -o $@ main.o -L. -ldll_a
b:main.o
esql -brtl -O -o $@ main.o -L. -ldll
.SUFFIXES:.o .c .ec
.c.o:
cc -g -c $<
.ec.o:
esql -g -c $<
rm -f $*.c
clean:
rm -f a b *.so *.a *.o
编译后的执行程序
a是通过静态库调用的
执行结果:
In main rq:[20130107]
[getrq.ec-16] [-349]
finderr 349
-349 Database not selected yet.
b是通过动态库调用的
执行结果:
In main rq:[20130107]
In getrq: RQ:[20130107]
哪位大侠指教下。谢谢! |
|