编译 C 用户定义的扩展

开始之前

您必须拥有一个用 C 语言编写的用户定义扩展。它可以是样本节点文件中讲述的样本节点,样本解析器文件中讲述的样本解析器,或者是您按照使用 C 语言创建消息处理或输出节点使用 C 创建输入节点使用 C 创建解析器中的说明那样创建的节点或解析器。用户定义的节点的名称必须采用这样的格式 <nodename>.lil

本部分提供有关如何编译用于所有支持的平台的用户定义的扩展的信息。

这些指示信息中使用的文件名是提供的样本的文件名。如果您正在编译您自己的用户定义的扩展,必须使用您自己的文件名替换这些文件名。

先决条件

在尝试编译您的用户定义的扩展之前,确保您有操作系统支持的相应的编译器。相应的编译器的示例为:

对于 Windows,Microsoft Visual C++ .NET 2003

对于 AIX,VisualAge® C++ for AIX V6.0

对于 HP-UX,HP ANSI C 03.52

对于Linux(x86 平台)Linux(zSeries 平台)2.4 内核和 2.6 内核,Gnu g++,最低版本 3.2

对于 Linux(POWER 平台),Gnu g++,最低版本 3.3

对于 Solaris SPARC
  • Sun ONE Studio 7,Enterprise Edition for Solaris
  • Sun ONE Studio 8,Compiler Collection

对于 Solaris x86-64,Sun Studio 10

对于 z/OS 语言环境(LE)z/OS 1.5、z/OS 1.6、z/OS C/C++ 1.5 或更高版本

头文件

C 接口由以下头文件定义:
BipCni.h
消息处理节点
BipCpi.h
消息解析器
BipCci.h
对于节点和解析器公共的接口
BipCos.h
平台特定定义

现有的客户或第三方提供的用户定义的扩展库将不进行修改或重新编译即在 WebSphere Message Broker 代理上运行,但是您必须在工作台中手动创建它们。

编译

在每个支持的平台上编译您的用户定义的扩展的源代码将创建代理实现您的用户定义的扩展所需的可装入实现库(LIL)文件。

移动到用户定义的扩展代码所在的目录。例如:
  cd install_dir\sample\extensions\nodes\  (Windows)
 
  cd install_dir/sample/extensions/nodes  (Linux and UNIX platforms)

Windows 上编译

Windows 上编译用户定义的节点(假设为 Microsoft Visual Studio C++ V7.1 中可用的 Microsoft 32 位 C/C++ 编译器),使用命令:
  cl /VERBOSE /LD /MD /Zi /I. /I..\..\..\include\plugin SwitchNode.c 
BipSampPluginUtil.c Common.c NodeFactory.c TransformNode.c -link 
/DLL ..\..\..\lib\imbdfplg.lib /OUT:SwitchNode.lil
注: 由于此命令较长,因此这里不得不将它分行显示。当输入该命令时,确保在 SwitchNode.cBipSampPluginUtil.c 之间加一个空格,还有在 -link/DLL 之间也加一个空格。

AIX 上编译

按如下所示,使用支持的 C 编译器在 AIX 上编译和链接用户定义的节点:
xlc_r \
   -I. \
   -I /opt/IBM/mqsi/6.0/include/plugin \
      -c SwitchNode.c \
   -o SwitchNode.o

xlc_r \
   -I. \
   -I /opt/IBM/mqsi/6.0/include/plugin \
      -c BipSampPluginUtil.c \
   -o BipSampPluginUtil.o

xlc_r \
   -I. \
   -I /opt/IBM/mqsi/6.0/include/plugin \
   -c Common.c \
   -o Common.o

xlc_r \
   -I. \
   -I /opt/IBM/mqsi/6.0/include/plugin \
   -c NodeFactory.c \
   -o NodeFactory.o

xlc_r -qmkshrobj \
      -bM:SRE \
      -bexpall \
      -bnoentry \
      -o SwitchNode.lil SwitchNode.o BipSampPluginUtil.o Common.o NodeFactory.o \
      -L /opt/IBM/mqsi/6.0/lib
         -l imbdfplg

chmod a+r SwitchNode.lil

HP-UX 上编译

按如下所示,使用支持的 C 编译器在 HP-UX 上编译和链接用户定义的节点:
cc +z \
-I. \
      -I<install_dir>/include \
      -I<install_dir>/include/plugin \
      -c BipSampPluginUtil.c \
   -o <output_dir>/BipSampPluginUtil.o

cc +z \
-I. \
      -I<install_dir>/include \
      -I<install_dir>/include/plugin \
   -c Common.c \
   -o <output_dir>/Common.o

cc +z \
-I. \
      -I<install_dir>/include \
      -I<install_dir>/include/plugin \
   -c NodeFactory.c \
   -o <output_dir>/NodeFactory.o

cc +z \
-I. \
      -I<install_dir>/include \
      -I<install_dir>/include/plugin \
      -c SwitchNode.c \
   -o <output_dir>/SwitchNode.o

cc +z \
-I. \
      -I<install_dir>/include \
      -I<install_dir>/include/plugin \
   -c TransformNode.c \
   -o <output_dir>/TransformNode.o


ld -b \
   -o <output_dir>/SwitchNode.lil \
   <output_dir>/BipSampPluginUtil.o \
   <output_dir>/Common.o \
   <output_dir>/NodeFactory.o \
   <output_dir>/SwitchNode.o \
   <output_dir>/TransformNode.o \
   -L <install_dir>/lib \
   -L <install_dir>/xml4c/lib \
   -L <install_dir>/merant/lib \
   -L <install_dir>/jre/lib/PA_RISC2.0 \
   -L <install_dir>/jre/lib/PA_RISC2.0/server \
      -l imbdfplg

chmod a+r <output_dir>/SwitchNode.lil

Linux 上编译

按如下所示,使用支持的 C 编译器在 Linux 上编译和链接用户定义的节点。注意此处为了便于阅读,已将命令分成数行显示。在输入时,每条命令只能位列一行。

/usr/bin/g++ -c -fpic -MD -trigraphs -I. -I/opt/mqsi/include 
    -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU 
    -D_GNU_SOURCE TransformNode.c
/usr/bin/g++ -c -fpic -MD -trigraphs -I. -I/opt/mqsi/include 
    -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU 
    -D_GNU_SOURCE SwitchNode.c /usr/bin/gcc -c -fpic -MD -trigraphs  -I. -I/opt/mqsi/include 
    -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU 
    -D_GNU_SOURCE BipSampPluginUtil.c 
/usr/bin/g++ -c -fpic -MD -trigraphs -I. -I/opt/mqsi/include 
    -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU 
    -D_GNU_SOURCE Common.c 
/usr/bin/g++ -c -fpic -MD -trigraphs -I. -I/opt/mqsi/include 
    -I/opt/mqsi/include/plugin -DLINUX -D__USE_GNU 
    -D_GNU_SOURCE NodeFactory.c
/usr/bin/g++ -o samples.lil
		TransformNode.o SwitchNode.o BipSampPluginUtil.o Common.o NodeFactory.o 
	  -shared -lc -lnsl -ldl -L/opt/mqsi/lib -limbdfplg 
这些命令会创建文件 samples.lil,该文件会提供 TransformNode 和 SwitchNode 对象。
更新开始采用 g++ 构建 C 插件时需要一些更改。 接口函数必须作为 C 样式函数定义到 C++ 编译器,如下:
 #ifdef __cplusplus
   extern "C"{
   #endif
   void LilFactoryExportPrefix * LilFactoryExportSuffix bipGetParserFactory()
   {                                                                   
   ...                                                                 
   ...                                                                 
   }                                                                   
   #ifdef __cplusplus
   }                                                                   
   #endif
注: ifdefs 对于保持代码可移植和隐藏 C 编译器中的 extern "C" 伪指令是必需的。
更新结束

Solaris 上编译

按如下所示,使用支持的 C 编译器在 Solaris 上编译和链接用户定义的节点:
cc -mt \
   -I. \
      -I<install_dir>/include \
      -I<install_dir>/include/plugin \
      -c SwitchNode.c \
   -o <output_dir>/SwitchNode.o

cc -mt \
   -I. \
      -I<install_dir>/include \
      -I<install_dir>/include/plugin \
      -c BipSampPluginUtil.c \
   -o <output_dir>/BipSampPluginUtil.o

cc -mt \
   -I. \
      -I<install_dir>/include \
      -I<install_dir>/include/plugin \
   -c NodeFactory.c \
   -o <output_dir>/NodeFactory.o

cc -mt \
   -I. \
      -I<install_dir>/include \
      -I<install_dir>/include/plugin \
   -c Common.c \
   -o <output_dir>/Common.o

cc -G \
   -o <output_dir>/SwitchNode.lil \
      <output_dir>/SwitchNode.o \
      <output_dir>/BipSampPluginUtil.o \
      <output_dir>/NodeFactory.o \
      <output_dir>/Common.o \
      -L <install_dir>/lib /
      -l imbdfplg

chmod a+r <output_dir>/SwitchNode.lil

z/OS 上编译

通过将 _CC_STEPS 变量设置为 -1,强制您的链接使用预链接程序或链接程序,如下所示:
export _CC_STEPS=-1
或者,您可以按如下所示在您的 makefile 中添加这两行以导出它:
_CC_STEPS=-1
.EXPORT : _CC_STEPS

按如下所示,使用支持的 C 编译器在 z/OS 上编译和链接用户定义的节点:

cc -c \
 -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL,TARGET\(OSV2R8\),float\(ieee\) \
 -Wc,xplink \
 -W0,LIST\(./SwitchNode.lst\) \
 -I. -I${install_dir}/include \
 -I${install_dir}/include/plugin \
  -I${install_dir}/sample/include \
  -I${install_dir}/sample/plugin \
 -o ./SwitchNode.o ./SwitchNode.c
cc -c \
 -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL,TARGET\(OSV2R8\),float\(ieee\) \
 -Wc,xplink \
 -W0,LIST\(./SwitchNode.lst\) \
 -I. -I${install_dir}/include \
 -I${install_dir}/include/plugin \
  -I${install_dir}/sample/include \
  -I${install_dir}/sample/plugin \
 -o ./BipSampPluginUtil.o ./BipSampPluginUtil.c
cc -c \
 -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL,TARGET\(OSV2R8\),float\(ieee\) \
 -Wc,xplink \
 -W0,LIST\(./SwitchNode.lst\) \
 -I. -I${install_dir}/include \
 -I${install_dir}/include/plugin \
  -I${install_dir}/sample/include \
  -I${install_dir}/sample/plugin \
 -o ./Common.o ./Common.c
cc -c \
 -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL,TARGET\(OSV2R8\),float\(ieee\) \
 -Wc,xplink \
 -W0,LIST\(./SwitchNode.lst\) \
 -I. -I${install_dir}/include \
 -I${install_dir}/include/plugin \
  -I${install_dir}/sample/include \
  -I${install_dir}/sample/plugin \
 -o ./NodeFactory.o ./NodeFactory.c
cc \
 -Wl,DLL -g  -Wl,p,map -Wl,LIST=ALL,MAP,XREF,REUS=RENT \
 -Wl,xplink \
 -o ./SwitchNode.lil ./SwitchNode.o ./BipSampPluginUtil.o \
 ./Common.o ./NodeFactory.o \
 ${install_dir}/lib/libimbdfplg.x

发送下列命令将用户定义扩展的文件许可权设置为“组读取及执行”:

chmod a+rx {output_dir}/SwitchNode.lil
注: 为了优化构建过程,-g 将变成 -2
相关概念
用户定义的扩展
相关参考
用户定义的扩展
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
as10000_