- 論壇徽章:
- 0
|
我在AIX系統(tǒng)下主程序通過dlopen的方式動態(tài)調(diào)用子程序,主程序中打開了數(shù)據(jù)庫,
如果將dlopen所在的函數(shù)編譯成動態(tài)庫,子程序能正常運(yùn)行。
如果將dlopen所在函數(shù)編譯成靜態(tài)庫,子程序中訪問數(shù)據(jù)庫報(bào)未打開數(shù)據(jù)庫。
不知道是編譯參數(shù)少了還是其他什么原因,請指教。
程序如下:
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("打開動態(tài)庫失敗!\n");
return (-1);
}
if( (func = (int (*)())dlsym(handle,funname)) == NULL ) {
printf("打開函數(shù)失敗!\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
編譯后的執(zhí)行程序
a是通過靜態(tài)庫調(diào)用的
執(zhí)行結(jié)果:
In main rq:[20130107]
[getrq.ec-16] [-349]
finderr 349
-349 Database not selected yet.
b是通過動態(tài)庫調(diào)用的
執(zhí)行結(jié)果:
In main rq:[20130107]
In getrq: RQ:[20130107]
哪位大俠指教下。謝謝! |
|