Compilación de una extensión C definida por el usuario

Antes de empezar

Debe tener una extensión definida por el usuario escrita en C. Puede ser uno de los nodos de ejemplo proporcionados que se describen en el apartado Archivos de nodo de ejemplo, el analizador de ejemplo que se describe en el apartado Archivos de analizador de ejemplo o un nodo o analizador que haya creado el usuario utilizando las instrucciones del apartado Creación de un nodo de proceso de mensajes o de salida en C, Creación de un nodo de entrada en C o Creación de un analizador en C. El nombre del nodo definido por el usuario debe tener el formato <nombrenodo>.lil.

Este apartado proporciona información sobre cómo compilar extensiones definidas por el usuario para todas las plataformas soportadas.

Los nombres de archivo utilizados en estas instrucciones son los de los ejemplos proporcionados. Si está compilando sus propias extensiones definidas por el usuario, deberá sustituir estos nombres de archivo por sus propios nombres de archivo.

Requisitos previos

Antes de intentar compilar la extensión definida por el usuario, asegúrese de tener un compilador apropiado soportado por el sistema operativo. Los compiladores siguientes son apropiados:

Para Windows, Microsoft Visual C++ .NET 2003

Para AIX, VisualAge C++ para AIX Versión 6.0

For HP-UX, HP ANSI C 03.52

Para Linux (plataforma x86) y Linux (plataforma zSeries) 2.4 Kernel y 2.6 Kernel, Gnu g++, versión mínima 3.2

Para Linux (plataforma POWER), Gnu g++, versión mínima 3.3

Para Solaris SPARC:
  • Sun ONE Studio 7, Enterprise Edition para Solaris
  • Sun ONE Studio 8, Compiler Collection

Para Solaris x86-64, Sun Studio 10

Para z/OS Language Environment (LE) z/OS 1.5, z/OS 1.6, z/OS C/C++ 1.5 o superior

Archivos de cabecera

Los siguientes archivos de cabecera definen las interfaces C:
BipCni.h
Nodos de proceso de mensajes
BipCpi.h
Analizadores de mensajes
BipCci.h
Interfaces comunes a nodos y analizadores
BipCos.h
Definiciones específicas de plataforma

Aunque las bibliotecas de extensiones existentes definidas por el usuario proporcionadas por el cliente o por terceros se ejecuten en un intermediario de WebSphere Message Broker sin realizar ninguna modificación o recompilación, tendrá que crearlas manualmente en el entorno de trabajo.

Compilación

La compilación del origen para la extensión definida por el usuario en cada una de las plataformas soportadas crea el archivo de biblioteca de implementación cargable (LIL) que el intermediario necesita para implementar la extensión definida por el usuario.

Vaya al directorio donde está ubicado el código de extensión definida por el usuario. Por ejemplo:
  cd dir_instalación\sample\extensions\nodes\ (Windows)
 
  cd dir_instalación/sample/extensions/nodes
(plataformas Linux y
UNIX)

Compilación en Windows

Compile el nodo definido por el usuario en Windows (suponiendo que se utiliza el Compilador C/C++ de 32 bits de Microsoft, disponible en Microsoft Visual Studio C++ Versión 7.1), utilizando el mandato:
  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
Nota: Debido a la longitud de este mandato, ha sido necesario mostrarlo partido en varias líneas. Cuando entre el mandato, asegúrese de que incluye un espacio entre SwitchNode.c y BipSampPluginUtil.c, y también entre -link y /DLL.

Compilación en AIX

Utilizando un compilador C soportado, compile y enlace el nodo definido por el usuario en AIX como se indica a continuación:
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

Compilación en HP-UX

Utilizando un compilador C soportado, compile y enlace el nodo definido por el usuario en HP-UX como se indica a continuación:
cc +z \
-I. \
   -I<dir_instalación>/include \
   -I<dir_instalación>/include/plugin \
   -c BipSampPluginUtil.c \
   -o <dir_salida>/BipSampPluginUtil.o

cc +z \
-I. \
   -I<dir_instalación>/include \
   -I<dir_instalación>/include/plugin \
   -c Common.c \
   -o <dir_salida>/Common.o

cc +z \
-I. \
   -I<dir_instalación>/include \
   -I<dir_instalación>/include/plugin \
   -c NodeFactory.c \
   -o <dir_salida>/NodeFactory.o

cc +z \
-I. \
   -I<dir_instalación>/include \
   -I<dir_instalación>/include/plugin \
   -c SwitchNode.c \
   -o <dir_salida>/SwitchNode.o

cc +z \
-I. \
   -I<dir_instalación>/include \
   -I<dir_instalación>/include/plugin \
   -c TransformNode.c \
   -o <dir_salida>/TransformNode.o


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

chmod a+r <dir_salida>/SwitchNode.lil

Compilación en Linux

Utilizando un compilador C soportado, compile y enlace el nodo definido por el usuario en Linux como se indica a continuación. Tenga en cuenta que las líneas se han partido para facilitar la lectura. Entre cada mandato como una sola línea de entrada.

/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 
Estos mandatos crean el archivo samples.lil, que proporciona los objetos TransformNode y SwitchNode.
Inicio del cambioCrear el plugin C con g++ requiere algunos cambios. La función de la interfaz se debe definir como una función de estilo C para el compilador C++, como se indica a continuación:
 #ifdef __cplusplus                                                  
   extern "C"{                                                        
   #endif                                                              
   void LilFactoryExportPrefix * LilFactoryExportSuffix bipGetParserFactory()                                               
   {                                                                   
   ...                                                                 
   ...                                                                 
   }                                                                   
   #ifdef __cplusplus                                                  
   }                                                                   
   #endif                                                        
Nota: Los elementos ifdefs son necesarios para poder portar el código y ocultar las directivas extern "C" de un compilador C.
Fin del cambio

Compilación en Solaris

Utilizando un compilador C soportado, compile y enlace el nodo definido por el usuario en Solaris como se indica a continuación:
cc -mt \
   -I. \
   -I<dir_instalación>/include \
   -I<dir_instalación>/include/plugin \
   -c SwitchNode.c \
   -o <dir_salida>/SwitchNode.o

cc -mt \
   -I. \
   -I<dir_instalación>/include \
   -I<dir_instalación>/include/plugin \
   -c BipSampPluginUtil.c \
   -o <dir_salida>/BipSampPluginUtil.o

cc -mt \
   -I. \
   -I<dir_instalación>/include \
   -I<dir_instalación>/include/plugin \
   -c NodeFactory.c \
   -o <dir_salida>/NodeFactory.o

cc -mt \
   -I. \
   -I<dir_instalación>/include \
   -I<dir_instalación>/include/plugin \
   -c Common.c \
   -o <dir_salida>/Common.o

cc -G \
   -o <dir_salida>/SwitchNode.lil \
      <dir_salida>/SwitchNode.o \
      <dir_salida>/BipSampPluginUtil.o \
      <dir_salida>/NodeFactory.o \
      <dir_salida>/Common.o \
   -L <dir_instalación>/lib /
   -l imbdfplg

chmod a+r <dir_salida>/SwitchNode.lil

Compilación en z/OS

Fuerce el enlace a que utilice el preenlazador o el enlazador estableciendo la variable _CC_STEPS en -1, como se indica a continuación:
export _CC_STEPS=-1
De forma alternativa, puede añadir estas dos líneas al archivo make (makefile) para exportarlo, como se indica a continuación:
_CC_STEPS=-1
.EXPORT : _CC_STEPS

Utilizando un compilador C soportado, compile y enlace el nodo definido por el usuario en z/OS como se indica a continuación:

cc -c \
 -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL,TARGET\(OSV2R8\),float\(ieee\) \
 -Wc,xplink \
 -W0,LIST\(./SwitchNode.lst\) \
 -I. -I${dir_instalación}/include \
 -I${dir_instalación}/include/plugin \
 -I${dir_instalación}/sample/include \
 -I${dir_instalación}/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${dir_instalación}/include \
 -I${dir_instalación}/include/plugin \
 -I${dir_instalación}/sample/include \
 -I${dir_instalación}/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${dir_instalación}/include \
 -I${dir_instalación}/include/plugin \
 -I${dir_instalación}/sample/include \
 -I${dir_instalación}/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${dir_instalación}/include \
 -I${dir_instalación}/include/plugin \
 -I${dir_instalación}/sample/include \
 -I${dir_instalación}/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 \
 ${dir_instalación}/lib/libimbdfplg.x

Establezca los permisos de la extensión definida por el usuario en lectura y ejecución para grupo emitiendo el siguiente mandato:

chmod a+rx {dir_salida}/SwitchNode.lil
Nota: -g se convierte en -2 para construcciones optimizadas.
Conceptos relacionados
Extensiones definidas por el usuario
Referencia relacionada
Extensiones definidas por el usuario
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
as10000_