2017年4月8日土曜日

ubuntu 上の oracle 12cで Pro*c コンパイル

ubuntuにoracle をインストールした直後の状態から Pro*c のコンパイルを通すには幾つか設定が必要である。




1.動作確認のために使用したPrco*Cプログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h>
/*
SQL> desc dept
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)
*/
struct {
  char deptno[2+1];
  char dname[14+1];
  char loc[13+1];
} rec;

void
main(argc,argv)
int argc;
char *argv[];
{
  char *sp_uid = "scott/tiger";

  EXEC SQL CONNECT :sp_uid;

  EXEC SQL DECLARE CUR_SCOTT CURSOR FOR
  SELECT DEPTNO,DNAME,LOC FROM DEPT;
  EXEC SQL OPEN CUR_SCOTT;

  while(1) {
    EXEC SQL FETCH CUR_SCOTT INTO :rec;

    if (sqlca.sqlcode == 1403) {
      break;
    }

    printf("DEPTNO = [%s]\n",rec.deptno);
    printf("DNAME  = [%s]\n",rec.dname);
    printf("LOC    = [%s]\n",rec.loc);
  }
}

2.$ORACLE_HOME/precomp/admin/pcscfg.cfg を環境に合わせて調整
  
$ vi $ORACLE_HOME/precomp/admin/pcscfg.cfg
=======================================================================
diff pcscfg.cfg.org pcscfg.cfg
1c1
< sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc-lib/x86_64-redhat-linux/3.2.3/include,/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include,/usr/lib64/gcc/x86_64-suse-linux/4.1.0/include,/usr/lib64/gcc/x86_64-suse-linux/4.3/include)
---
> sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/include/x86_64-linux-gnu,/usr/lib/gcc/x86_64-linux-gnu/6.2.0/include)
=======================================================================

3.LD_LIBRARY_PATHを設定
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
  • $ORACLE_HOME/lib配下には、ubuntu のデフォルトライブラリと重複するライブラリがあるため、 ウインドウマネージャを使用するアカウントや、ライブラリ更新などを行うアカウントの .profile などに登録すると干渉起こす場合がある。オラクル関連のアプリをコンパイル、起動する際に 設定するか、専用のアカウントで使用するのがよいと思われる。

4.コンパイル用Makefile (procオプションのコード生成は"ANSI_C"とする)
PROGRAM = sample01
OBJS    = sample01.o
CC      = gcc
PROC    = proc
PFLAGS  = include=$(ORACLE_HOME)/precomp/public
PFLAGS += include=$(ORACLE_HOME)/rdbms/public
PFLAGS += include=.
PFLAGS += CODE=ANSI_C
#PFLAGS += CODE=CPP

CFLAGS  = -O3 -trigraphs -fPIC -DPRECOMP
CFLAGS += -I$(ORACLE_HOME)/precomp/public
CFLAGS += -I$(ORACLE_HOME)/rdbms/public
CFLAGS += -I$(ORACLE_HOME)/plsql/public
CFLAGS += -I$(ORACLE_HOME)/network/public
CFLAGS += -I.
CFLAGS += -DLINUX -DORAX86_64 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE=1
CFLAGS += -D_LARGEFILE_SOURCE=1 -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT
CFLAGS += -DNS_THREADS -DLONG_IS_64 -DSS_64BIT_SERVER -DLDAP_CM -m64
LDFLAGS = -L$(ORACLE_HOME)/lib -lclntsh -lsql12 -L $(ORACLE_HOME)/precomp/lib -lproc2 -lm

.SUFFIXES: .c .o
.SUFFIXES: .pc .c

$(PROGRAM):$(OBJS)
 $(CC) $^ -o $@ $(LDFLAGS)

.c.o:
 $(CC) $(CFLAGS) -c $<

.pc.c:
 $(PROC) iname=$* $(PFLAGS)

clean:

5.コンパイルと実行
$ ls -l
合計 16
-rw-r--r-- 1 naoki naoki 904  3月 29 15:24 Makefile
-rw-r--r-- 1 naoki naoki 854  3月 29 15:24 sample01.pc
$ make
proc iname=sample01 include=/u01/app/oracle/product/11.2.0/dbhome_1/precomp/public include=/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/public include=. CODE=ANSI_C

Pro*C/C++: Release 11.2.0.1.0 - Production on 水 3月 29 15:33:04 2017

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

システムのデフォルト・オプション値: /u01/app/oracle/product/11.2.0/dbhome_1/precomp/admin/pcscfg.cfg

gcc -O3 -trigraphs -fPIC -DPRECOMP -I/u01/app/oracle/product/11.2.0/dbhome_1/precomp/public -I/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/public -I/u01/app/oracle/product/11.2.0/dbhome_1/plsql/public -I/u01/app/oracle/product/11.2.0/dbhome_1/network/public -I. -DLINUX -DORAX86_64 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS -DLONG_IS_64 -DSS_64BIT_SERVER -DLDAP_CM -m64 -c sample01.c
gcc sample01.o -o sample01 -L/u01/app/oracle/product/11.2.0/dbhome_1/lib -lclntsh -lsql11 -L /u01/app/oracle/product/11.2.0/dbhome_1/precomp/lib -lproc2 -lm
rm sample01.c
$ ls -l
合計 48
-rw-r--r-- 1 inst12c inst12c   904  3月 29 15:24 Makefile
-rwxr-xr-x 1 inst12c inst12c 12928  3月 29 15:33 sample01
-rw-r--r-- 1 inst12c inst12c     0  3月 29 15:33 sample01.lis
-rw-r--r-- 1 inst12c inst12c  4552  3月 29 15:33 sample01.o
-rw-r--r-- 1 inst12c inst12c   854  3月 29 15:24 sample01.pc
$ sample01
DEPTNO = [10]
DNAME  = [ACCOUNTING    ]
LOC    = [NEW YORK     ]
DEPTNO = [20]
DNAME  = [RESEARCH      ]
LOC    = [DALLAS       ]
DEPTNO = [30]
DNAME  = [SALES         ]
LOC    = [CHICAGO      ]
DEPTNO = [40]
DNAME  = [OPERATIONS    ]
LOC    = [BOSTON       ]

0 件のコメント:

コメントを投稿