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

Compile extensões definidas pelo usuário em C para todos os sistemas operacionais suportados.

Antes de começar

Início da mudançaSe você criar seus próprios nós definidos pelo usuário, analisadores e saídas de usuário em C, compile-os no sistema operacional em que o intermediário de destino está sendo executado. As amostras são fornecidas para nós e analisadores e são descritas em Arquivos de Nós de Amostra e Arquivos de Analisadores de Amostra. Utilize as seguintes instruções para compilar as amostras. Se desejar criar suas próprias extensões, consulte os seguintes tópicos: Fim da mudança

Início da mudançaFim da mudança

Estas instruções utilizam os nomes de arquivos das amostras fornecidas. Se você estiver compilando suas próprias extensões definidas pelo usuário, substitua esses nomes de arquivos pelos seus próprios nomes de arquivos.

Ao compilar uma extensão definida pelo usuário que é gravada em C, é necessário ter um compilador compatível. Para obter detalhes de compiladores suportados, consulte Suporte Opcional ao Software.

Arquivos de Cabeçalho

Os arquivos de cabeçalho a seguir definem as interfaces de C:
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

Compilando

Compile a origem para a extensão definida pelo usuário em cada um dos sistemas operacionais suportados para criar o arquivo executável que o intermediário chama para implementar a extensão definida pelo usuário. Nos sistemas Linux, UNIX e z/OS, este arquivo é um arquivo LIL (Loadable Implementation Library); nos sistemas Windows é um DLL (Dynamic Load Library).

Início da mudançaAs bibliotecas criadas para conter nós definidos pelo usuário ou analisadores devem ter a extensão .lil em todos os sistemas operacionais, para que o intermediário possa carregá-los. As bibliotecas que contêm saídas de usuário devem ter a extensão .lel em todos os sistemas operacionais. Os exemplos neste tópico mostram bibliotecas com a extensão .lil.Fim da mudança

Início da mudançaConsulte a documentação para o compilador que está sendo utilizado para obter detalhes completos de opções de compilação e link disponíveis que podem ser necessárias para seus programas. Fim da mudança

Navegue para o diretório onde seu código-fonte de extensão definido pelo usuário está localizado e siga as instruções para o sistema operacional:

Compilando no AIX

Ao compilar uma extensão definida pelo usuário que é gravada em C, utilize um compilador suportado.

Início da mudança
xlc_r -q32 \
   -I. \
   -I/install_dir/include/plugin \
   -c SwitchNode.c \
   -o SwitchNode.o

xlc_r -q32 \
   -I. \
   -I/install_dir/include/plugin \
   -c BipSampPluginUtil.c \
   -o BipSampPluginUtil.o

xlc_r -q32 \
   -I. \
   -I/install_dir/include/plugin \
   
-c Common.c \
   -o Common.o

xlc_r -q32 \
   -I. \
   -I/install_dir/include/plugin \
   -c NodeFactory.c \
   -o NodeFactory.o

xlc_r -q32 \
      -qmkshrobj \
      -bM:SRE \
      -bexpall \
      -bnoentry \
      -o SwitchNode.lil SwitchNode.o \
         BipSampPluginUtil.o Common.o NodeFactory.o \
      -L /install_dir/lib \
      -l imbdfplg

chmod a+r SwitchNode.lil
Fim da mudança

Compilando no HP-UX em PA-RISC

Ao compilar uma extensão definida pelo usuário que é gravada em C, utilize um compilador suportado.

Início da mudança
cc +z -DD32 \
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c BipSampPluginUtil.c \
   -o output_dir/BipSampPluginUtil.o \
   -Ae

cc +z -DD32 \
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   
-c Common.c \
   -o output_dir/Common.o \
   -Ae

cc +z -DD32 \
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c NodeFactory.c \
   -o output_dir/NodeFactory.o \
   -Ae

cc +z -DD32 \
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c SwitchNode.c \
   -o output_dir/SwitchNode.o \
   -Ae

cc +z -DD32 \
   -I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c TransformNode.c \
   -o output_dir/TransformNode.o \
   -Ae

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
Fim da mudança

Compilando no HP-UX em Itanium

Ao compilar uma extensão definida pelo usuário que é gravada em C, utilize um compilador suportado.

Início da mudança
aCC -O +DD64 -AA -mt +z\
-I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c BipSampPluginUtil.c \
   -o output_dir/BipSampPluginUtil.o

aCC -O +DD64 -AA -mt +z\
-I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   
-c Common.c \
   -o output_dir/Common.o

aCC -O +DD64 -AA -mt +z\
-I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c NodeFactory.c \
   -o output_dir/NodeFactory.o

aCC -O +DD64 -AA -mt +z\
-I. \
   -I/install_dir/include \
   -I/install_dir/include/plugin \
   -c SwitchNode.c \
   -o output_dir/SwitchNode.o

aCC -O +DD64 -AA -mt +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/IA64N\
   -L install_dir/jre/lib/IA64N/server \
   -l imbdfplg

chmod a+r output_dir/SwitchNode.lil
Fim da mudança

Compilando no Linux

Ao compilar uma extensão definida pelo usuário que é gravada em C, utilize um compilador suportado.

/usr/bin/g++ -c -fpic -MD -trigraphs
   -I.    -I/install_dir/include
   -I/install_dir/include/plugin
   -DLINUX -D__USE_GNU -D_GNU_SOURCE
   TransformNode.c
/usr/bin/g++ -c -fpic -MD -trigraphs
   -I.    -I/opt/mqsi/include
   -I/install_dir/include/plugin
   -DLINUX -D__USE_GNU -D_GNU_SOURCE
   SwitchNode.c
/usr/bin/gcc -c -fpic -MD -trigraphs
   -I.    -I/opt/mqsi/include
   -I/install_dir/include/plugin
   -DLINUX -D__USE_GNU -D_GNU_SOURCE
   BipSampPluginUtil.c
/usr/bin/g++ -c -fpic -MD -trigraphs
   -I.    -I/opt/mqsi/include
   -I/install_dir/include/plugin
   -DLINUX -D__USE_GNU -D_GNU_SOURCE
   Common.c
/usr/bin/g++ -c -fpic -MD -trigraphs
   -I.    -I/opt/mqsi/include
   -I/install_dir/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/install_dir/lib -limbdfplg 

Estes comandos criam o arquivo samples.lil que fornece objetos TransformNode e SwitchNode.

A construção da extensão definida pelo usuário em C com g++ requer algumas alterações; você deve definir a função da interface como uma função de estilo C para o compilador C++. No exemplo a seguir, os ifdefs mantêm seu código portátil e ocultam as diretivas extern "C" a partir de um compilador C.

 #ifdef __cplusplus
   extern "C"{
   #endif
   void LilFactoryExportPrefix * LilFactoryExportSuffix bipGetParserFactory()
   {                                                                   
   ...                                                                 
   ...                                                                 
   }                                                                   
   #ifdef __cplusplus
   }                                                                   
   #endif

Compilando no Solaris

Ao compilar uma extensão definida pelo usuário que é gravada em C, utilize um compilador suportado.

Início da mudança
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
Fim da mudança

Compilando no Windows

Ao compilar uma extensão definida pelo usuário que é gravada em C, utilize um compilador suportado.

Inclua um espaço entre SwitchNode.c e BipSampPluginUtil.c, e também entre -link e /DLL.

Insira o comando como uma única linha de entrada; no exemplo a seguir, as linhas foram divididas para melhorar a capacidade de leitura.

Início da mudança
cl /VERBOSE /LD /MD /Zi /GX /I.
   /Iinstall_dir\include\plugin
   SwitchNode.c BipSampPluginUtil.c Common.c
   NodeFactory.c TransformNode.c
   -link /DLL install_dir\lib\imbdfplg.lib
   /OUT:SwitchNode.lil
Fim da mudança

Se você configurou corretamente a variável de ambiente LIB, não precisará especificar os caminhos completos para os arquivos LIB.

Compilando no z/OS

Ao compilar uma extensão definida pelo usuário que é gravada em C, utilize um compilador suportado.

Force seu link a utilizar um pré-linker ou linker, configurando a variável _CC_STEPS como -1:
export _CC_STEPS=-1
Como alternativa, inclua estas duas linhas em seu arquivo pronto para exportá-lo:
_CC_STEPS=-1
.EXPORT : _CC_STEPS

Para criar construções otimizadas, utilize -2 no lugar de -g nos seguintes comandos:

cc -c \
 -Wc,DLL -g -W0,long,langlvl\(extended\),EXPORTALL,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,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,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, 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

Emita o comando a seguir para configurar as permissões da extensão definida pelo usuário para leitura de grupo e para ser executável:

chmod a+rx {output_dir}/SwitchNode.lil