问题描述:
命令行编译完成后,运行程序,报错如下
================================================================

$ proc code=cpp sqlcheck=semantics dbms=V8 include=/oracle/app/product/9.2.0/precomp/public include=/usr/include include=. include=/include userid=test/test@test  iname=test.pcPro*C/C++: Release 9.2.0.5.0 - Production on Wed Apr 26 18:22:04 2006Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.System default option values taken from: /oracle/app/product/9.2.0/precomp/admin/pcscfg.cfg$ xlC -+ -o test.e    test.c -I/oracle/app/product/9.2.0/precomp/public -I/usr/include -I/include -I/include -I. -L/oracle/app/product/9.2.0/lib32 -lcurses -lclntsh -L/usr/lib -lpapi

$ test.e
exec(): 0509-036 Cannot load program test.e because of the following errors:
        0509-150   Dependent module /oracle/app/product/9.2.0/lib/libclntsh.a(shr.o) could not be loaded.
        0509-103   The module has an invalid magic number.
$
================================================================
看不行,我就用make编译,运行如下:
================================================================$ make all
        xlC -+ -o test.o -c test.c -I/oracle/app/product/9.2.0/precomp/public -I/usr/include -I/include -I/include -I. -L/oracle/app/product/9.2.0/lib32 -lcurses -lclntsh -L/usr/lib -lpapi
        xlC -+ -o test test.o -I/oracle/app/product/9.2.0/precomp/public -I/usr/include -I/include -I/include -I. -L/oracle/app/product/9.2.0/lib32 -lcurses -lclntsh -L/usr/lib -lpapi
Target "all" is up to date.
$ test
$
(运行程序以后,和刚才的结果不一样,没有任何反应,没有任何返回,也不报错)
================================================================

解决方案 »

  1.   

    makefile文件:
    CC=xlCPROCFLAGS= code=cpp sqlcheck=semantics dbms=V8 userid=test/test@TESTORA_INCLUDE= include=$(ORACLE_HOME)/precomp/public include=/usr/include include=.INCLUDE= -I$(ORACLE_HOME)/precomp/public -I/usr/include -I$(AS_HOME)/include -I$(TUXDIR)/include -I.ORALIB= -L$(ORACLE_HOME)/lib32 -lcurses -lclntshAPPLIB= -L/usr/lib -lpapiPROC= procEXE= $(AS_HOME)/bin
    all: test.o test.SUFFIXES: .pc .c.pc.c:
            $(PROC) $(PROCFLAGS) $(ORA_INCLUDE) include=$(TUXDIR)/include iname=$*.pc
    my:
            $(PROC) $(PROCFLAGS) $(ORA_INCLUDE) include=$(TUXDIR)/include iname=test.pctest.o: test.c
            $(CC) -+ -o test.o -c test.c $(INCLUDE) $(ORALIB) $(APPLIB)test: test.o
            $(CC) -+ -o test test.o $(INCLUDE) $(ORALIB) $(APPLIB)install:
            maketouch:
            touch test.pc
      

  2.   

    test.pc :
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <time.h>
    #include <sqlca.h>
    #include <sqlcpr.h>EXEC SQL INCLUDE SQLCA;void fnWriteLog(char *strLogInfo)
    {
      time_t t;
      struct tm *tb;
      char strLogFile[80] = "\0";  /* 获得当前系统时间,以约定log 文件名 */
            t = time(NULL);
            tb = localtime(&t);
            sprintf(strLogFile, "%04d%02d%02d", 1900+tb->tm_year, 1+tb->tm_mon, tb->tm_mday);
            printf("%s  %02d:%02d:%02d. %s\n",strLogFile,tb->tm_hour, tb->tm_min, tb->tm_sec, strLogInfo);
    }
    /****************************************************************/
    #define CONNECT_DATABASE(x,y)        {        \
                                                                            if(!x)        \
                                                                            {        \
                                                                                    while(1) \
                                                                                    { \
                                                                                            if(fnConnectDatabase() == -1) \
                                                                                            { \
                                                                                                    if(y < 20) { y ++ ; continue ;} \
                                                                                                    else { \
                                                                                                                    sprintf(errinfo, (char*)"Connect database retry [%d] times failed!", y) ; \
                                                                                                                    fnWriteLog(errinfo) ; \
                                                                                                                    exit(-1) ; \
                                                                                                            } \
                                                                                            } \
                                                                                            else {x = 1 ; y = 0 ;break ;} ;        \
                                                                                    } \
                                                                            }        \
                                                                    }
    #define DISCONNECT_DATABASE(x) { \
                                                                            if(x) \
                                                                            { \
                                                                                    if(fnDisConnectDatabase() != -1) x = 0 ; \
                                                                            } \
                                                                    }
    /****************************************************************/
    int fnSqlHandle(long lSqlcode)
    {
            char sqlerr[100] = "\0";        if(lSqlcode < 0 && lSqlcode != -1405)
            {
                    sprintf(sqlerr, "SQL ERROR ! sqlca.sqlcode is [%d]",lSqlcode) ;
                    fnWriteLog(sqlerr) ;
                    return (-1);
            }        if(lSqlcode == 1403 || lSqlcode == 100)
            {
                    sprintf(sqlerr, "SQL ERROR ! sqlca.sqlcode is [%d]",lSqlcode) ;
                    fnWriteLog(sqlerr) ;
                    return (-2) ;
            }        return (0) ;
    }int fnConnectDatabase()
    {
            EXEC SQL BEGIN DECLARE SECTION;
                    VARCHAR  uid[20];
                    VARCHAR  pwd[20];
                    VARCHAR  svr[20];
            EXEC SQL END DECLARE SECTION;        memset(&uid,0,sizeof(uid));
            memset(&pwd,0,sizeof(pwd));
            memset(&svr,0,sizeof(svr));        strcpy ((char *)uid.arr,(char *)"test1");        uid.len = strlen((char *)uid.arr);
            strcpy ((char *)pwd.arr,(char *)"test1");        pwd.len = strlen((char *)pwd.arr);
            strcpy((char*)svr.arr,(char *)"TEST");                        svr.len = strlen((char*)svr.arr);        EXEC SQL WHENEVER SQLERROR CONTINUE;
            EXEC SQL CONNECT :uid IDENTIFIED BY :pwd USING :svr;
            if(sqlca.sqlcode < 0)        {        fnWriteLog("Connet database failed!\n");        return (-1);        }
            return (0);
    }int fnDisConnectDatabase()
    {
            EXEC SQL COMMIT WORK RELEASE ;
            if(sqlca.sqlcode < 0)        {        fnWriteLog("DisConnet database failed!\n");        return (-1);        }
            return (0) ;
    }
    /****************************************************************/
    int main(int arc,char *argv[])
    {
            printf("44444444444\n");        EXEC SQL BEGIN DECLARE SECTION ;
                    char        checkmonth[7] = "\0";  
                    char        serialnumber[15] = "\0";
                    EXEC SQL VAR checkmonth IS STRING(7) ;
                    EXEC SQL VAR serialnumber IS STRING(15) ;
            EXEC SQL END DECLARE SECTION ;        int                iRet = 0;
            int                connected = 0, retrytimes = 0 ;
            char        errinfo[500] = "\0";
            int                i=0;
            
    printf("44444444444\n");
            CONNECT_DATABASE(connected,retrytimes);
    printf("555555555\n");        EXEC SQL DECLARE curUsrstate CURSOR for
                    SELECT serial_number
                    FROM TF_F_USER
                    WHERE update_time<sysdate;
    printf("666666666\n");                                        
            iRet = fnSqlHandle(sqlca.sqlcode);
            if( iRet < 0)        {                return iRet;        }        EXEC SQL OPEN curUsrstate ;
            if(fnSqlHandle(sqlca.sqlcode) < 0)        {                 return (-1) ;        }
    printf("77777777\n");
            while(i++<100)
            {
                    EXEC SQL FETCH curUsrstate INTO :serialnumber;
                    iRet = fnSqlHandle(sqlca.sqlcode);
                    if( iRet < 0) break;
                    printf("%s\n", serialnumber);
            }        EXEC SQL CLOSE         curUsrstate ;
            if(iRet == -1)        {                return iRet;        }
            DISCONNECT_DATABASE(connected);
            exit;
    }
      

  3.   

    更正,我运行test也是报错:
    $ ./test
    exec(): 0509-036 Cannot load program test.e because of the following errors:
            0509-150   Dependent module /oracle/app/product/9.2.0/lib/libclntsh.a(shr.o) could not be loaded.
            0509-103   The module has an invalid magic number.