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

[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

[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でコンパイル)
※11.2のバージョンには64bit製品に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)

★ORACLE案件承ります