Pergunta

EDITAR: Suponho que devo esclarecer, caso isso importa. Estou em uma caixa AIX UNIX, por isso estou usando compiladores VAC - nenhum compilador GNU.ENDO ENDIT


Estou muito enferrujado em C/C ++, então me perdoe se essa é uma pergunta simples.

Gostaria de tirar funções comuns de alguns dos meus programas C e colocá -los em bibliotecas compartilhadas ou objetos compartilhados. Se eu estivesse fazendo isso no Perl, colocaria meus subs em um módulo Perl e usaria esse módulo quando necessário.

Por um exemplo, digamos que eu tenho esta função:

int giveInteger()
{
    return 1034;
}

Obviamente, este não é um exemplo do mundo real, mas se eu quisesse compartilhar essa função, como iria proceder?

Tenho certeza de que tenho 2 opções:

  1. Coloque minha função compartilhada em um arquivo e faça com que ele compile com meu programa principal no horário de compilação. Se eu fizer alterações na minha função compartilhada, teria que recompilar meu programa principal.
  2. Coloque minha função compartilhada em um arquivo e compile -a como uma biblioteca compartilhada (se eu tiver meus termos corretos) e tenha meu link principal do programa para essa biblioteca compartilhada. Quaisquer alterações que fizer na minha biblioteca compartilhada (depois de compilá-la) seriam integradas ao meu programa principal no tempo de execução sem recarregar meu programa principal.

Estou correto sobre esse pensamento?

Se sim, como posso complicar um dos dois métodos? Eu procurei muito e pareço encontrar informações como eu poderia ter meu próprio link para a biblioteca compartilhada de outra pessoa, mas não como criar minhas próprias funções compartilhadas e compilá -las de uma maneira que posso usá -las em meu próprio programa .

Muito obrigado!

Brian


EDITAR:

Conclusão

Obrigado a todos pela sua ajuda! Eu pensei em adicionar a este post o que está funcionando para mim (para bibliotecas compartilhadas dinâmicas na AIX) para que outros possam se beneficiar:

Eu compilar minhas funções compartilhadas:

xlc -c sharedFunctions.c -o sharedFunctions.o

Em seguida, faça um objeto compartilhado:

xlc -qmkshrobj -qexpfile=exportlist sharedFunctions.o
xlc -G -o libsharedFunctions.so sharedFunctions.o  -bE:exportlist

Em seguida, vincule outro programa:

xlc -brtl -o mainProgram mainProgram.c  -L. -lsharedFunctions

E outro comentário me ajudou a encontrar este link, o que também ajudou:http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/topic/com.ibm.vacpp7a.doc/proguide/ref/compile_library.htm

Mais uma vez obrigado a todos que me ajudaram!

Foi útil?

Solução

Sim, você está correto. O primeiro é chamado de Biblioteca estática, enquanto o segundo é chamado de Biblioteca compartilhada, porque o código não está vinculado ao executável no momento da compilação, mas sempre quando seu programa é carregado.

Biblioteca estática

Compile o código da sua biblioteca da seguinte forma:

gcc -c *.c

o -c diz ao programa para não vincular o arquivo de objeto, mas apenas deixa você com arquivos de objeto para cada .c arquivo que foi compilado. Agora, arquiva -os em uma biblioteca estática:

ar rcs libmystuff.a *.o 

man ar dirá o que significam as opções do RCS. Agora, libmystuff.a é um umaArquivo RCHive (você pode abri-lo com alguns visualizadores de zip-arquivo) que contêm esses arquivos de objeto, juntamente com um índice de símbolos para cada arquivo de objeto. Você pode vinculá -lo ao seu programa:

gcc *.c libmystuff.a -o myprogram

Agora, seu programa está pronto. Observe que a ordem de onde as bibliotecas estáticas aparecem no assunto do comando. Veja meu Pedido de link responda.

Biblioteca compartilhada

Para uma biblioteca compartilhada, você criará sua biblioteca com

gcc -shared -o libmystuff.so *.c

É tudo o que é preciso, libmystuff.so agora é um sareado oarquivo bject. Se você deseja vincular um programa a ele, você deve colocá -lo em um diretório listado no /etc/ld.so.conf arquivo, ou isso é dado pelo -L Alterne para o GCC, ou listado na variável ld_library_path. Ao vincular, você corta o lib prefixo e .so Sufixo do nome da biblioteca que você diz ao GCC.

gcc -L. -lmystuff *.c -o myprogram

Internamente, o GCC simplesmente passará seus argumentos para o ligante GNU. Você pode ver quais argumentos ele passa usando o -### Opção: O GCC imprimirá os argumentos exatos fornecidos a cada sub -processo.

Para detalhes sobre o processo de vinculação (como algumas coisas são feitas internamente), veja meu Linker Linux GCC responda.

Outras dicas

Você tem uma terceira opção. Em geral, seu compilador C ++ deve ser capaz de vincular rotinas C. As opções necessárias podem variar do compilador para o compilador, então r o seu fino M, mas basicamente você deve ser capaz de compilar com G ++ como aqui:

$ g++ -o myapp myapp.cpp myfunc.c giveint.c

... ou compilar separadamente

$ gcc -c myfunc.c
$ gcc -c giveint.c
$ g++ -c myapp.cpp
$ g++ -o myapp myapp.o myfunc.o

Você também precisa incluir sua declaração das funções; você faz isso em c ++ como

extern "C" {
    int myfunc(int,int);
    int giveInterger(void);
}

Você precisa distinguir entre recompilar e vincular.

Se você colocar giveInteger() em uma biblioteca separada (arquivamento) e depois modificá -la mais tarde, você (obviamente) precisará recompilar o arquivo de origem no qual é definido e RIIN Todos os programas que o usam; Mas você não precisará recompile Tais programas [1].

Para uma biblioteca compartilhada, você precisará recompilar e vincular a biblioteca; Mas você não precisará vincular ou recompilar nenhum dos programas que o usam.

Construir bibliotecas compartilhadas C ++ no AIX costumavam ser complicadas; Você precisava usar o script de shell makec ++ sharedlib. Mas com o VAC 5.0 e 6.0, ficou bastante fácil. Eu acredito que tudo o que você precisa fazer é [2]:

xlC -G -o shr.o giveInteger.cc
xlC -o myapp main.cc shr.o

1] Se você escrever makefile correto (que é prática recomendada), tudo isso acontecerá automaticamente quando você digitar make.

2] Existe um certo recurso do AIX que pode complicar assuntos: por padrão, as bibliotecas compartilhadas são carregadas na memória e "aderem" lá até a reinicialização subsequente. Assim, você pode reconstruir o shr.o, executar novamente o programa e observar a versão "antiga" da biblioteca sendo executada. Para evitar isso, uma prática comum é tornar o SHR.O que não é o mundial:

chmod 0750 shr.o
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top