Compilazione di un'estensione definita dall'utente in C

Prima di iniziare

E' necessario disporre di un'estensione definita dall'utente in C. Questa può essere uno dei nodi di esempio forniti descritti in File di nodi di esempio, il programma di analisi di esempio descritto in File di programmi di analisi di esempio oppure un nodo o un programma di analisi che è stato creato utilizzando le istruzioni in Creazione di un nodo di output o di elaborazione messaggi in C, Creazione di un nodo di input in C o Creazione di un programma di analisi in C. Il nome del nodo definito dall'utente deve essere nel formato <nomenodo>.lil.

Questa sezione fornisce informazioni su come compilare estensioni definite dall'utente per tutte le piattaforme supportate.

I nomi file utilizzati in queste istruzioni sono quelli degli esempi forniti. Se si stanno compilando proprie estensioni definite dall'utente, è necessario sostituire tali nomi file con i nomi dei propri file.

Prerequisiti

Prima di tentare di compilare la propria estensione definita dall'utente, accertarsi di disporre di un compilatore supportato dal sistema operativo in uso. Esempi di compilatori appropriati sono:

Per Windows, Microsoft Visual C++ .NET 2003

Per AIX, VisualAge C++ per AIX Versione 6.0

Per HP-UX, HP ANSI C 03.52

Per Linux (piattaforma x86) e Linux (piattaforma zSeries) 2.4 Kernel e 2.6 Kernel, Gnu g++, a partire dalla versione 3.2

Per Linux (piattaforma POWER), Gnu g++, a partire dalla versione 3.3

Per Solaris SPARC:
  • Sun ONE Studio 7, Enterprise Edition per Solaris
  • Sun ONE Studio 8, Compiler Collection

Per Solaris x86-64, Sun Studio 10

Per z/OS LE (Language Environment) z/OS 1.5, z/OS 1.6, z/OS C/C++ 1.5 o versioni successive

File di intestazione

Le interfacce C sono definite dai seguenti file di intestazione:
BipCni.h
Nodi di elaborazione dei messaggi
BipCpi.h
Programmi di analisi dei messaggi
BipCci.h
Interfacce comuni sia ai programmi di analisi che ai nodi
BipCos.h
Definizioni specifiche della piattaforma

Le esistenti librerie di estensioni definite dall'utente fornite da terze parti o da clienti vengono eseguite su un broker WebSphere Message Broker senza alcuna modifica o ricompilazione; tuttavia, è necessario crearle manualmente nel workbench.

Compilazione

Mediante la compilazione dell'origine per l'estensione definita dall'utente su ognuna delle piattaforme supportate, viene creato il file LIL (Loadable Implementation Library) necessario al broker per implementare l'estensione definita dall'utente.

Portarsi nella directory in cui è ubicato il codice dell'estensione definita dall'utente. Ad esempio:
  cd install_dir\sample\extensions\nodes\  (Windows)
 
  cd install_dir/sample/extensions/nodes  (piattaforme Linux e UNIX)

Esecuzione della compilazione su Windows

Compilare il nodo definito dall'utente su Windows (assumendo che il compilatore C/C++ a 32 bit Microsoft sia disponibile in Microsoft Visual Studio C++ Versione 7.1), utilizzando il comando:
  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: a causa della sua lunghezza, è stato necessario suddividere il comando su più righe. Quando si immette il comando, assicurarsi di includere uno spazio tra SwitchNode.c e BipSampPluginUtil.c ed inoltre tra -link e /DLL.

Esecuzione della compilazione su AIX

Compilare ed eseguire il link del nodo definito dall'utente su AIX come riportato di seguito, utilizzando un compilatore C supportato:
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

Esecuzione della compilazione su HP-UX

Compilare ed eseguire il link del nodo definito dall'utente su HP-UX come riportato di seguito, utilizzando un compilatore C supportato:
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

Esecuzione della compilazione su Linux

Compilare ed eseguire il link del nodo definito dall'utente su Linux come riportato di seguito, utilizzando un compilatore C supportato. Tenere presente che le righe sono state suddivise per migliorare la leggibilità. Immettere ciascun comando come una singola riga di input.

/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 
Questi comandi creano il file samples.lil, che fornisce gli oggetti TransformNode e SwitchNode.
Inizio modificaLa creazione del plugin C con g++ richiede alcune modifiche. La funzione dell'interfaccia deve essere definita come funzione di stile C nel compilatore C++, nel modo seguente:
 #ifdef __cplusplus                                                  
   extern "C"{                                                        
   #endif                                                              
   void LilFactoryExportPrefix * LilFactoryExportSuffix bipGetParserFactory()                                               
   {                                                                   
   ...                                                                 
   ...                                                                 
   }                                                                   
   #ifdef __cplusplus                                                  
   }                                                                   
   #endif                                                        
Nota: le ifdef sono necessarie per mantenere il proprio codice trasferibile e per nascondere le direttive extern "C" da un compilatore C.
Fine modifica

Esecuzione della compilazione su Solaris

Compilare ed eseguire il link del nodo definito dall'utente su Solaris come riportato di seguito, utilizzando un compilatore C supportato:
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

Esecuzione della compilazione su z/OS

Forzare il link ad utilizzare il prelinker o il linker impostando la variabile _CC_STEPS su -1, come riportato di seguito:
export _CC_STEPS=-1
In alternativa, è possibile aggiungere queste due righe al file per esportarlo, come riportato di seguito:
_CC_STEPS=-1
.EXPORT : _CC_STEPS

Compilare ed eseguire il link del nodo definito dall'utente su z/OS come riportato di seguito, utilizzando un compilatore C supportato:

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

Impostare le autorizzazioni del file dell'estensione definita dall'utente su esecuzione e lettura gruppi immettendo il seguente comando:

chmod a+rx {output_dir}/SwitchNode.lil
Nota: -g diventa -2 per creazioni ottimizzate.
Riferimenti correlati
Estensioni definite dall'utente
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
as10000_