Crie arquivo .so a partir do arquivo .c usando a linha de comando gcc

162

Estou tentando criar um projeto hello world para bibliotecas dinâmicas do Linux (arquivos .so). Então, eu tenho um arquivo hello.c:

#include <stdio.h>
void hello()
{
    printf("Hello world!\n");
}

Como crio um arquivo .so que exporta hello()usando o gcc na linha de comando?

sashoalm
fonte

Respostas:

291

Para gerar uma biblioteca compartilhada, você precisa primeiro compilar seu código C com o -fPICsinalizador (código independente de posição).

gcc -c -fPIC hello.c -o hello.o

Isso irá gerar um arquivo de objeto (.o), agora você o pega e cria o arquivo .so:

gcc hello.o -shared -o libhello.so

EDIT : Sugestões dos comentários:

Você pode usar

gcc -shared -o libhello.so -fPIC hello.c

para fazer isso em uma etapa. - Jonathan Leffler

Também sugiro adicionar -Wallpara obter todos os avisos e -gobter informações de depuração aos seus gcccomandos. - Basile Starynkevitch

dreamcrash
fonte
1
Você deve executar gcc -c -fPIC blabla.c -o blabla.o primeiro e, em seguida, o comando acima.
dreamcrash
57
Ou gcc -shared -o libhello.so -fPIC hello.cpara fazê-lo em uma etapa.
31813 Jonathan Leffler
5
Também sugiro adicionar -Wallpara obter todos os avisos e -gobter informações de depuração aos seus gcccomandos.
Basile Starynkevitch 14/02
Obrigado pelas recomendações, eu adicionei-los para a resposta
dreamcrash
3
O .oarquivo @sashoalm é basicamente um arquivo de objeto para o arquivo de origem, antes de vinculá-los, no executável final. Então, quando você executa gcc -o abc.c abc.oum arquivo de objeto, será gerado. Resp, então você pode usar esse abc.oarquivo para criar um .soarquivo. Para criar tantos arquivos, tudo o que você precisa é de um código c correto, escrito em um .carquivo. PS: Apenas para esclarecer sua dúvida no comentário.