C 関数と EGL との併用

EGL プログラムは、C 関数を呼び出すことができます

C 関数を EGL から呼び出す手順は、次のとおりです。

ご使用の EGL プログラムで使用する C 関数を確認したら、以下を行う必要があります。
  1. EGL スタック・ライブラリーおよびアプリケーション・オブジェクト・ファイルを、IBM® Web サイトからコンピューターにダウンロードする。
  2. すべての C コードを 1 つの共用ライブラリーにコンパイルし、適切なプラットフォーム固有のスタック・ライブラリーにリンクする。
  3. 関数テーブルを作成する。
  4. この関数テーブルと適切なプラットフォーム固有のアプリケーション・オブジェクト・ファイルを共用ライブラリーにコンパイルし、この共用ライブラリーを、ステップ 2 で作成した共用ライブラリーとスタック・ライブラリーにリンクする。

1. EGL スタック・ライブラリーとアプリケーション・オブジェクト・ファイルをダウンロードする

EGL スタック・ライブラリーとアプリケーション・オブジェクト・ファイルをダウンロードする手順は、次のとおりです。
  1. EGL Support Web サイトにアクセスする。
    • Rational® Application Developer の URL は、次のとおりです。
      http://www3.software.ibm.com/ibmdl/pub/software/rationalsdp/rad/60/redist
    • Rational Web Developer の URL は、次のとおりです。
      http://www3.software.ibm.com/ibmdl/pub/software/rationalsdp/rwd/60/redist 
    .
  2. EGLRuntimesV60IFix001.zip ファイルを適切なディレクトリーにダウンロードする。
  3. EGLRuntimesV60IFix001.zip を unzip して、以下のファイルがあることを確認する。
プラットフォーム固有のスタック・ライブラリーの場合 .
プラットフォーム固有のアプリケーション・オブジェクト・ファイルの場合 .

2. すべての C コードを共用ライブラリーにコンパイルする

C コードは、ポップ外部関数を使用して EGL から値を受け取り、戻り外部関数を使用して EGL に値を戻します。ポップ外部関数については、『EGL からの値の受け取り』で、 戻り外部関数については、『EGL への値の戻り』で説明します。

すべての C コードを共用ライブラリーにコンパイルする手順は、次のとおりです。
  1. 標準メソッドを使用して、すべての C コードを 1 つの共用ライブラリーにコンパイルし、適切なプラットフォーム固有の EGL スタック・ライブラリーにリンクする。
  2. 次のプラットフォーム固有の例では、file1.cfile2.c は、EGL から呼び出された関数を含む C ファイルです。

    AIX では、以下のようになります (ld コマンドは単一行上に存在する必要があります)。
    cc -c -Iincl_dir  file1.c file2.c
    ld -G -b32 -bexpall -bnoentry
       -brtl file1.o file2.o -Lstack_lib_dir 
       -lstack -o lib1_name -lc

    Linux では、以下のようになります (gcc コマンドは単一行上に存在する必要があります)。
    cc -c -Iincl_dir  file1.c file2.c
    gcc -shared file1.o file2.o -Lstack_lib_dir
        -lstack -o lib1_name

    Windows® では、以下のようになります (link コマンドは単一行上に存在する必要があります)。

    cl /c -Iincl_dir file1.c file2.c 
    link /DLL file1.obj file2.obj 
         /LIBPATH:stack_lib_dir 
         /DEFAULTLIB:stack.lib /OUT:lib1_name
    incl_dir
    ヘッダー・ファイルのディレクトリー・ロケーション
    stack_lib_dir
    スタック・ライブラリーのディレクトリー・ロケーション
    lib1_name
    出力ライブラリーの名前
注: C コードが IBM Informix® ESQL/C ライブラリー関数 (BIGINT、DECIMAL、DATE、INTERVAL、DATETIME) を使用している場合、ESQL/C ライブラリーにもリンクする必要があります。

3. 関数テーブルを作成する

関数テーブルとは、EGL プログラムから呼び出されるすべての C 関数の名前を含む C ソース・ファイルです。 次の関数テーブル例では、c_fun1c_fun2 が C 関数の名前です。コード内で識別されるすべての関数は、上記のステップ 2 で作成した C 共用ライブラリーからエクスポート済みでなければなりません。

#include <stdio.h>
struct func_table {

      char *fun_name;
      int (*fptr)(int); 
};

extern int c_fun1(int);
extern int c_fun2(int);
/* 他の関数に対しても同様のプロトタイプ */

struct func_table ftab[] =
            {
                 "c_fun1", c_fun1,
                 "c_fun2", c_fun2,
                 /* 他の関数に対しても同様 */
                 "", NULL
            };  

上記の例を基にして関数テーブルを作成し、適切な C 関数を使用して関数テーブルにデータを取り込みます。 "", NULL で関数テーブルの終わりを示します。

4. 関数テーブルとプラットフォーム固有のアプリケーション・オブジェクトを共用ライブラリーにコンパイルする

アプリケーション・オブジェクト・ファイルは、EGL コードと C コードとの間のインターフェースです。

次の 2 つの成果物を 1 つの共用ライブラリーにコンパイルし、上記のステップ 2 で作成したスタック・ライブラリーおよびライブラリーにリンクします。

次のサンプルを使用して新規の共用ライブラリーをコンパイルします。ここで ftable.c は、関数テーブルの名前、mylib は、ステップ 2 で作成した C 共用ライブラリーの名前、lib_dir は、mylib のディレクトリー・ロケーションです。dllName プロパティーまたは vgj.defaultI4GLNativeLibrary Java™ ランタイム・プロパティーを使用して lib2_name を指定します。

AIX では、以下のようになります (ld コマンドは単一行上に存在する必要があります)。

cc -c  ftable.c
ld -G -b32 -bexpall -bnoentry
   -brtl ftable.o application.o 
   -Lstack_lib_dir -lstack -Llib_dir 
   -lmylib -o lib2_name -lc

Linux では、以下のようになります (gcc コマンドは単一行上に存在する必要があります)。

cc -c  ftable.c
gcc -shared ftable.o application.o 
    -Lstack_lib_dir -lstack -Llib_dir
    -lmylib -o lib2_name

Windows では、以下のようになります (link コマンドは単一行上に存在する必要があります)。

cl /c ftable.c
link /DLL ftable.obj application.obj 
     /LIBPATH:stack_lib_dir 
     /DEFAULTLIB:stack.lib 
     /LIBPATH:lib_dir 
     /DEFAULTLIB:mylib.lib /OUT:lib2_name

これら 3 つのライブラリーを一緒にリンクします。

C 共用ライブラリー、関数テーブル、およびスタック・ライブラリーがリンクされると、EGL コードから C 関数を呼び出すことができる状態になります。 EGL 内で C 関数を呼び出す方法については、『EGL プログラムからの C 関数の呼び出し』を参照してください。

関連する概念
リンケージ・オプション・パーツ

関連する参照項目
C の BIGINT 関数
C データ型と EGL プリミティブ型
C の DATE 関数
C の DATETIME および INTERVAL 関数
C の DECIMAL 関数
EGL プログラムからの C 関数の呼び出し
EGL への値の戻り
EGL からの値の受け取り

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.(C) Copyright IBM Japan 2005.