UNIX系OSのPro*Cコンパイル方法
UNIX系OSの場合ORACLEのインストール前提条件にコンパイラが必要であるためWindowsと異なりコンパイラのインストール作業等は不要です。 また、UNIX系OSではインストール作業を軽減できるmakeコマンドでコンパイルするのが一般的でORACLEのデモ用プログラムにもmakefile(demo_proc.mk)が付属しています。以下は11gでの実行例となりますがバージョンやOSによってリンクするファイル名やコンパイラのオプションは異なるため必ず作業環境のに適したmakefileを使用してコンパイルしてください。
[ora111@linux1 proc]$ pwd /app/oracle/product/11.1.0/db_1/precomp/demo/proc [ora111@linux1 proc]$ ls -l | grep sample1 -rw-r--r-- 1 ora111 oinstall 3765 11月 27 2006 sample1.pc 1 [ora111@linux1 proc]$ env | grep PATH LD_LIBRARY_PATH=/app/oracle/product/11.1.0/db_1/lib PATH=/app/oracle/product/11.1.0/db_1/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/ora111/bin 2 [ora111@linux1 proc]$ make -f demo_proc.mk OBJS=sample1.o EXE=sample1 build make -f /app/oracle/product/11.1.0/db_1/precomp/demo/proc/demo_proc.mk PROCFLAGS="" PCCSRC=sample1 I_SYM=include= pc1 make[1]: ディレクトリ `/app/oracle/product/11.1.0/db_1/precomp/demo/proc' に入ります ※1 proc iname=sample1 include=. include=/app/oracle/product/11.1.0/db_1/precomp/public include=/app/oracle/product/11.1.0/db_1/rdbms/public include=/app/oracle/product/11.1.0/db_1/rdbms/demo include=/app/oracle/product/11.1.0/db_1/plsql/public include=/app/oracle/product/11.1.0/db_1/network/public Pro*C/C++: Release 11.1.0.6.0 - Production on Wed Jul 30 02:27:55 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved. System default option values taken from: /app/oracle/product/11.1.0/db_1/precomp/admin/pcscfg.cfg make[1]: ディレクトリ `/app/oracle/product/11.1.0/db_1/precomp/demo/proc' から出ます ※2 /usr/bin/gcc -O2 -fPIC -DPRECOMP -I. -I/app/oracle/product/11.1.0/db_1/precomp/public -I/app/oracle/product/11.1.0/db_1/rdbms/public -I/app/oracle/product/11.1.0/db_1/rdbms/demo -I/app/oracle/product/11.1.0/db_1/plsql/public -I/app/oracle/product/11.1.0/db_1/network/public -DLINUX -D_GNU_SOURCE -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS -c sample1.c sample1.c: In function ‘main’: sample1.c:241: 警告: return type of ‘main’ is not ‘int’ /usr/bin/gcc -o sample1 sample1.o -L/app/oracle/product/11.1.0/db_1/lib/ -lclntsh `cat /app/oracle/product/11.1.0/db_1/lib/ldflags` `cat /app/oracle/product/11.1.0/db_1/lib/sysliblist` -lm sample1.o: In function `main': sample1.c:(.text+0x434): warning: the `gets' function is dangerous and should not be used. 実行可能ファイルが作成されていることを確認 [ora111@linux1 proc]$ ls -l | grep sample1 -rwxr-xr-x 1 ora111 oinstall 9049 7月 30 02:27 sample1 -rw-r--r-- 1 ora111 oinstall 12571 7月 30 02:27 sample1.c -rw-r--r-- 1 ora111 oinstall 0 7月 30 02:27 sample1.lis -rw-r--r-- 1 ora111 oinstall 5276 7月 30 02:27 sample1.o -rw-r--r-- 1 ora111 oinstall 3765 11月 27 2006 sample1.pc
1 設定してある環境変数の確認
Linuxの場合設定が必要な環境変数は以下の通りです
ORACLE_HOME・・・・インストール時に指定したディレクトリ
PATH・・・・・・・$ORACLE_HOME/bin
LD_LIBRARY_PATH・・$ORACLE_HOME/lib
補足
LD_LIBRARY_PATHは参照するライブラリを指定する環境変数ですが、OSによっては異なる環境変数を使用する場合があります。
OS | 環境変数 | 設定値 |
Linux | LD_LIBRARY_PATH | $ORACLE_HOME/lib(32bit環境でコンパイルまたは64bit環境で64bitでコンパイル) $ORACLE_HOME/lib32:$ORACLE_HOME/lib(64bit環境で32bitでコンパイル) |
Solaris | LD_LIBRARY_PATH | $ORACLE_HOME/lib(32bit環境でコンパイルまたは64bit環境で64bitでコンパイル) $ORACLE_HOME/lib32:$ORACLE_HOME/lib(64bit環境で32bitでコンパイル) |
HP-UX | LD_LIBRARY_PATH、SHLIB_PATH | LD_LIBRARY_PATHには$ORACLE_HOME/lib、SHLIB_PATHには$ORACLE_HOME/lib32 |
AIX | LIBPATH | $ORACLE_HOME/lib(64bitでコンパイル)または$ORACLE_HOME/lib32:$ORACLE_HOME/lib(32bitでコンパイル) |
従って32bitアプリケーションを使用する場合は32bit製品を別途インストールする必要があります。
これらを設定していない場合やワードサイズの設定を誤った場合(32bitでのコンパイル時に64bit用ライブラリを使用としたような場合)は 以下のようにライブラリが参照できない、またはワードサイズが異なるといったエラーが発生します。
proc: error while loading shared libraries: libclntsh.so.11.1: cannot open shared object file: No such file or directory make[1]: *** [pc1] エラー 127 make[1]: ディレクトリ `/app/oracle/product/11.1.0/db_1/precomp/demo/proc' から出ます make: *** [sample1.o] エラー 2
2 makeコマンドによりプリコンパイル及びコンパイル、リンクを実行
makeコマンドは主にコンパイル作業を軽減するコマンドで、makefileと呼ばれるmakeコマンド用の設定ファイルに従い、コンパイルコマンドの生成及び実行を行います。上記の例では以下を順番に実行しています。
makeの実行
- -f オプションを付与してmakefile名(demo_proc.mk)を指定します。
- OBJSとEXEはmakefileの中で参照されている変数名です。(OBJSはオブジェクトファイル名、EXEは実行可能ファイル名)
- buildというのはmakefile中で定義されているコンパイル方法の指定です。(buildは動的リンク、build_staticは静的リンク)
make -f demo_proc.mk OBJS=sample1.o EXE=sample1 build※1 makeによってprocコマンドでsample1.pcをプリコンパイルする以下のコマンドが実行される
proc iname=sample1 include=. include=/app/oracle/product/11.1.0/db_1/precomp/public include=/app/oracle/product/11.1.0/db_1/rdbms/public include=/app/oracle/product/11.1.0/db_1/rdbms/demo include=/app/oracle/product/11.1.0/db_1/plsql/public include=/app/oracle/product/11.1.0/db_1/network/public※2 makeによって※1で作成されたsample1.cをgccでコンパイル、リンクする以下のコマンドが実行される
/usr/bin/gcc -O2 -fPIC -DPRECOMP -I. -I/app/oracle/product/11.1.0/db_1/precomp/public -I/app/oracle/product/11.1.0/db_1/rdbms/public -I/app/oracle/product/11.1.0/db_1/rdbms/demo -I/app/oracle/product/11.1.0/db_1/plsql/public -I/app/oracle/product/11.1.0/db_1/network/public -DLINUX -D_GNU_SOURCE -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS -c sample1.c
3 実行
sample1はscottスキーマのemp表のデータを検索するプログラムです。 以下、実行例となります。
[ora111@linux1 proc]$ ./sample1 Connected to ORACLE as user: scott Enter employee number (0 to quit): 7369 Employee Salary Commission -------- ------- ---------- SMITH 800.00 NULL Enter employee number (0 to quit): 0 Total rows returned was 1. G'day.
補足
11.1までのバージョンでは64bit環境では64bitと32bitのコンパイルが両方可能ですが以下のようにコンパイルしたいワードサイズによって使用するファイル及び設定を使い分けます。ワードサイズ | 使用するプリコンパイラ | 32bitコンパイル用makefile | 64bitコンパイル用makefile |
---|---|---|---|
32bit | proc(Pro*COBOLの場合はprocob) | demo_proc.mk | なし(64bitコンパイル不可) |
64bit | proc(Pro*COBOLの場合はprocob32) | demo_proc32.mk | demo_proc.mk(8iまではdemo_proc64.mk) |