- ソースプログラムの準備
- Pro*Cによるプリコンパイル
- GCCによるコンパイル
- リンク
- gcc -o
- ld
- -lc … Cの標準関数を含むライブラリ(libc.so)
- crt1.o、crti.o、crtn.o … Cラインタイムオブジェクト(C RunTime startup)
- プログラムの実行
- makeの使用
ディレクトリ/usr (UnixSystem Resources)以下には、一般に使用するユーザコマンド、共有ライブラリ、そして開発環境が入っている。開発環境はさらに系統別に分類され下記のディレクトリに置かれる。
/usr/ccs (C Compiler Support) | … | SystemV系 |
/usr/sfw (Sun Free Ware) | … | GNU系 |
/usr/ucb (University ofCalifornia Berkeley) | … | BSD系 |
開発環境の構築といっても、Oracleユーザのプロファイルには、パスと環境変数が設定済みであるので、それをそのまま使用するか、ユーザを新規に作成する場合はプロファイルをコピーすれば、すでにパスが通っているので、下記のSolaris 10 にバンドルされている、コンパイラなどは直接起動できる。
GNU Cコンパイラ、リンカ(3.4.3) | … |
/usr/sfw/bin/gcc |
Solarisリンカ(5.10-1.493) | … |
/usr/ccs/bin/ld |
GNU make(3.80) | … |
/usr/sfw/bin/gmake |
Solaris make | … |
/usr/ccs/bin/make |
加えてOracle 10gをインストールしたのでPro*C/C++、すなわち埋め込みSQL(Embedded SQL)をコンパイル前に処理するプリコンパイラ(precompilerまたはプリプロセッサpreprocessorと呼ぶ)と、SQL処理のライブラリが装備されている。なおかつ、本回までの作業を終えているならば、オラクルとの接続が確立されているはずで、C 言語によるOracle データベースへアクセスするプログラムの開発条件が満たされているので、それの開発を試みる。
Oracleインストールの事前準備の設定で、必要な環境条件が調っている「oracle」ユーザーでログインして、下記の静的SQL(staticSQL.pc)と動的SQL(dynamicSQL.pc)のソースファイルを2種類作成する。置く場所は任意である。プログラムの内容は、Oracleに「scott」ユーザーで接続して、自分のテーブルの数をカウントして表示するという、ごく単純で短いものだ。
両者は同じSQL文を使用しているが、静的SQLと動的SQLの違いは、静的SQLがSQL文をリテラルで保持しているのに対して、動的SQLは文字列変数内に保持していることである。プリコンパイラはさすがに文字列の中身までは解析しないし、いつ変わるとの知れない、文字通り「変数」の中身を解析するのは無意味なことなのだ。
静的SQL(staticSQL.pc)
動的SQL(dynamicSQL.pc)
Pro*CによるプリコンパイルでPro*Cのソースプログラム(*.pc)からCコンパイラが理解できるCのソースプログラム(*.c)に変換する。変換する内容は、「EXECSQL」から「;(セミコロン)」までの実行ステートメントをSQLLIB(ランタイムライブラリ)の関数をコールするソースコードに置き換え、「EXEC SQL BEGIN DECLARESECTION;」から「EXEC SQL END DECLARESECTION;」までに入っている、C言語のプログラムとOracleが共有する変数、これをホスト変数と呼ぶが、両者が使用できるようにする。
プリコンパイラは下記のように、拡張子なしでプログラム名を指定して実行する。また、オプションに、sqlcheck=fullに設定することで埋込みSQL構文の解析を完全に実行しておく、プリコンパイルでSQL構文の不備を撥ねるのだ。静的SQLでuseridオプションを指定しているのは、プリコンパイルの段階で、実際にこの接続先からSQL文中にあるテーブル構造を読み取りに行くので、必須のオプションである。
静的SQL
動的SQL
GCC はコンパイラのみならず、プリプロセス、コンパイル、アセンブル、リンクの各機能を呼び出す親プログラムである。ここではコンパイルまでを行うので「-c」オプションを指定して、コンパイルの対象になるソースプログラムファイルを指定すると、同名で拡張子を「.o」に変えたオブジェクトコードを作成する。
続いて「-I」オプションによってヘッダファイルを探すディレクトリを指定する。プログラム中でsqlca.hをincludeしている。これは「$ORACLE_HOME/precomp/public」の配下に有るのでその場所を指定する。
静的SQL
動的SQL
どちらが良いとはいえないので、リンカにGNUのコマンドを使った「gcc -o」と、Sunのコマンドを使った「ld」の、2種類のコマンドを例示する。
先に下記のように環境変数を設定しておいたので、オプションの設定を簡略することが出来る。LD_LIBRARY_PATHを設定して置かないと、リンカは標準ライブラリ(「/usr/ccs/lib/」、「/usr/lib」)の中のみを検索するので、「-L」オプションを用いて、ライブラリを検索するパスを示してから、Oracleのライブラリを指定しなければならない。さらに、「-R」オプションによって、実行時にロードするライブラリへの検索パスを、実行プログラムに組み込む必要がある。したがって、この環境変数を設定しておくことによって、「-L」、「-R」オプションの設定を省略することが出来る。
LD_LIBRARY_PATH=$ORACLE_HOME/lib
標準ライブラリではない、または環境変数に定義していない任意のライブラリは、「-L」と「-l(小文字のL)」オプションと組み合わせて使用する。リンカは、「-L」で指示されたパスを起点にして、そこから「-l」で指定したライブラリ名に接頭辞「lib」を加えたものを、共有ライブラリ(shared library)、スタティックライブラリ(static library)の順に検索する。すなわち拡張子を「.so」、「.a」の順に加えて検索したライブラリを、リンクリストに加えるオプションである。
例えば、「-lclntsh」と指定した場合は、LD_LIBRARY_PATH で指定してあるので、「-L」オプションは不要であり、$ORACLE_HOME/lib/以下の共有ライブラリ「libclntsh.so」を検索して、そこからシンボリックリンクを張った「libclntsh.so.10.1」をリンクリストに加え、実行時リンカは、実行時にこの共有ライブラリを結合する。
リンクにGCCを使用する場合は下記のように行う。すなわち「-o」オプションでリンクを指定して、実行ファイル名、リンクするオブジェクトコード、そしてライブラリを指定して、実行ファイルを作成する。
静的SQL
動的SQL
下記は「gcc -o」では暗黙でリンクされるが「ld」ではリンクされないライブラリである。これが両者の違いであるので「ld」では明示する。
したがって、「ld」ではそれらを追加して下記のように行う。なお、Cラインタイムオブジェクトは「gcc -o」は/usr/lib以下のオブジェクトを使用しているが、ここではOracleライブラリのものを使用した。
静的SQL
動的SQL
出来上がった実行ファイルを実行すると、scottがオーナーであるテーブル数、すなわち「DEPT」、「EMP」、「BONUS」、「SALGRADE」の4個のテーブルがカウントされ、下記のように表示される。
静的SQL
動的SQL
「make」というコマンドを実行すると、カレントディレクトの中のファイルをmakefile、Makefile (以降makefileで統一)の順に探し、その記述を読み込んで実行する。記述には実行可能ファイル作成までの手順が書かれている。後で示すmakefileが既に作成済みであるとすると、「-n」オプションを加えて実行した結果は下記のとおりであり、プリコンパイル、コンパイル、リンクが順次実行される様子が分かる。
これだけではシェルスクリプトにコマンドをならべたことと同じであるが、make は依存関係の検査という仕組みを使用して、生成するファイルが、そのファイルの生成に影響するファイルよりも新しい場合は、該当するコマンドは実行しない。これにより、更新されたファイルに関連性のあるものだけを処理するため、不要な処理を抑制することが出来る。
makefileはターゲット行、シェルコマンド行、マクロ定義 インクルード行によって構成される。ターゲット行は下記のように、対になるコマンド行と構成される場合は、これをルール(rule)と呼ぶ。
「ルール」の記法には、サフィックスルール(suffix rule)とパターンルール(patternrule)がある。パターンルールを用いて、プリコンパイルを行う場合は、下記のように記述する。すなわち下記は、%.pcから%.cをproc…コマンドによって作成するという意味になり、「%」はmakeを「make [options] [target] 」のように起動したときの[target]が置き換わる。「$<」は自動変数と呼ばれ、ここでは「%.pc」、要するにPro*Cのソースプログラムが該当する。
一連の処理を下記のmakefileにまとめた、これをソースプログラムと同じディレクトリに保存する。
下記のとおりmakeを起動すると、実行可能ファイルが作成される。
静的SQL
動的SQL
あるいは、下記のようにすると指定したターゲットまでの中間処理までをおこなう。
静的SQL
動的SQL
0 件のコメント:
コメントを投稿