将 C 函数与 EGL 配合使用

EGL 程序可调用 C 函数

要从 EGL 调用 C 函数:

在标识要在 EGL 程序中使用的 C 函数之后,必须:
  1. 将 EGL 堆栈库和应用程序对象文件从 IBM® Web 站点下载至您的计算机。
  2. 将所有 C 代码编译到一个共享库中并将其链接至相应的特定于平台的堆栈库。
  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 以标识下列文件:
对于特定于平台的堆栈库: .
对于特定于平台的应用程序对象文件: .

2. 将所有 C 代码编译到共享库中

C 代码使用出栈外部函数从 EGL 接收值并使用返回外部函数将值返回至 EGL。出栈外部函数在从 EGL 接收值中作了描述;返回外部函数在将值返回至 EGL 中作了描述。

要将所有 C 代码编译到共享库中:
  1. 使用标准方法,将所有 C 代码编译到一个共享库中并将其链接至相应的特定于平台的 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. 创建函数表

函数表是一个 C 源文件,该源文件包括要从 EGL 程序调用的所有 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);
/* Similar prototypes for other functions */

struct func_table ftab[] =
            {
                 "c_fun1", c_fun1,
                 "c_fun2", c_fun2,
                 /* Similarly for other functions */
                 "", NULL
            };  

根据上述示例创建函数表,并使用相应的 C 函数填充函数表。用 "" 和 NULL 来指示函数表的结束。

4. 将函数表和特定于平台的应用程序对象文件编译到共享库中

应用程序对象文件在 EGL 代码与 C 代码之间的接口中。

下面两个构件必须编译到一个共享库中并且链接至堆栈库和上面步骤 2 中创建的库:

使用以下示例编译新的共享库,其中 ftable.c 是函数功能的名称,mylib 是步骤 2 中创建的 C 共享库的名称,而 lib_dirmylib 的目录位置。通过使用 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

将三个库链接在一起。

使用 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.