Compilando uma Extensão Definida pelo Usuário em C

Antes de começar

Você deve ter uma extensão definida pelo usuário gravada em C. Pode ser um dos nós de amostra fornecidos descritos em Arquivos de Nós de Amostra, o analisador de amostras descrito em Arquivos de Analisadores de Amostra ou um nó ou analisador criado por você mesmo utilizando as instruções de Criando um Nó de Processamento de Mensagem ou de Saída em C, Criando um Nó Input em C ou Criando um Analisador em C. O nome do nó definido pelo usuário deve estar no formato <nodename>.lil.

Esta seção fornece informações sobre como compilar extensões definidas pelo usuário para todas as plataformas suportadas.

Os nomes de arquivos utilizados nestas instruções são os das amostras fornecidas. Se você estiver compilando suas próprias extensões definidas pelo usuário, deverá substituir esses nomes de arquivos pelos seus próprios nomes de arquivos.

Pré-requisitos

Antes de tentar compilar sua extensão definida pelo usuário, certifique-se de ter um compilador apropriado suportado pelo sistema operacional. Exemplos de compiladores apropriados são:

Para Windows, Microsoft Visual C++ .NET 2003

Para AIX, VisualAge C++ para AIX Versão 6.0

Para HP-UX, HP ANSI C 03.52

Para Linux (plataforma x86) e Linux (plataforma zSeries) 2.4 Kernel e 2.6 Kernel, Gnu g++, versão mínima 3.2

Para Linux (plataforma POWER), Gnu g++, versão 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 LE (Language Environment) z/OS 1.5, z/OS 1.6, z/OS C/C++ 1.5 ou superior

Arquivos de Cabeçalho

As interfaces em C são definidas pelos seguintes arquivos de cabeçalho:
BipCni.h
Nós de processamento de mensagem
BipCpi.h
Analisadores de mensagem
BipCci.h
Interfaces comuns a nós e analisadores
BipCos.h
Definições específicas de plataforma

As bibliotecas de extensões definidas pelo usuário existentes do cliente ou fornecidas por terceiros executarão em um intermediário do WebSphere Message Broker sem modificação ou recompilação, porém é preciso criá-las manualmente no workbench.

Compilação

Compilar a origem para a extensão definida pelo usuário em cada uma das plataformas suportadas cria o arquivo LIL (Loadable Implementation Library) de que o intermediário necessita para implementar a extensão definida pelo usuário.

Mova para o diretório onde o código da extensão definido pelo usuário está localizado. Por exemplo:
  cd
install_dir\sample\extensions\nodes\
(Windows)
   cd install_dir/sample/extensions/nodes  (plataformas Linux e UNIX)

Compilando no Windows

Compile o nó definido pelo usuário no Windows (supondo o Compilador C/C++ Microsoft de 32 bits, disponível no Microsoft Visual Studio C++ Versão 7.1), utilizando o 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: Devido ao comprimento desse comando, tem sido necessário mostrar a extensão do comando sobre várias linhas. Ao digitar o comando, assegure-se de incluir um espaço entre SwitchNode.c e BipSampPluginUtil.c, e também entre -link e /DLL.

Compilando no AIX

Compile e vincule o nó definido pelo usuário no AIX da seguinte forma, utilizando um compilador C suportado:
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

Compilando no HP-UX

Compile e vincule o nó definido pelo usuário no HP-UX da seguinte forma, utilizando um compilador C suportado:
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

Compilando no Linux

Compile e vincule o nó definido pelo usuário no Linux da seguinte forma, utilizando um compilador C suportado. Observe que as linhas foram divididas para melhorar a leitura. Digite cada comando como uma única linha 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 
Esses comandos criam o arquivo samples.lil que fornece objetos TransformNode e SwitchNode.
Início da mudançaConstruindo o plug-in do C com g++ requer algumas alterações. A função da interface deve ser definida como uma função de estili C para o compilador C++ da seguinte forma:
 #ifdef __cplusplus
   extern "C"{
   #endif
   void LilFactoryExportPrefix * LilFactoryExportSuffix bipGetParserFactory()
   {                                                                   
   ...                                                                 
   ...                                                                 
   }                                                                   
   #ifdef __cplusplus
   }                                                                   
   #endif
Nota: Os ifdefs são necessários para manter seu código portátil e ocultar as diretivas extern "C" a partir de um compilador C.
Fim da mudança

Compilando no Solaris

Compile e vincule o nó definido pelo usuário no Solaris da seguinte forma, utilizando um compilador C suportado:
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

Compilando no z/OS

Força seu link a utilizar um pré-vinculador, definindo a variável _CC_STEPS como -1, da seguinte forma:
export _CC_STEPS=-1
Como alternativa você pode incluir estas duas linhas a seu arquivo pronto para exportá-lo, da seguinte maneira:
_CC_STEPS=-1
.EXPORT : _CC_STEPS

Compile e vincule o nó definido pelo usuário no z/OS da seguinte forma, utilizando um compilador C suportado:

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

Configure as permissões de arquivo da extensão definida pelo usuário para leitura e execução de grupo emitindo o seguinte comando:

chmod a+rx {output_dir}/SwitchNode.lil
Nota: -g se torna -2 para construções otimizadas.
Conceitos relacionados
Extensões Definidas pelo Usuário
Referências relacionadas
Extensões Definidas pelo Usuário
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
as10000_