paulo1205
(usa Ubuntu)
Enviado em 13/10/2017 - 15:06h
dark777 escreveu:
Beleza moçada fiz ums lib que limpa os buffers do teclado
Poderia mostrar como você fez? Há muitas maneiras erradas de fazer isso, e eu gostaria de ver se você não incorreu num desses erros.
e queria saber como faço para criar as bibliotecas dinamicas e estaticas instalando as mesmas corretamente no meu SO para o compilador reconhecer elas ao realizar o seguinte comando:
$ gcc -o prog prog.c -l<minhabiblioteca>
Para criar bibliotecas estáticas, você simplesmente compila (sem invocar o
linker ) os programas que fazem parte dela, e os junta num arquivo.
gcc -c arq1.c arq2.c arq3.c
ar -crs libABCD.a arq1.o arq2.o arq3.o
Para as dinâmicas, será parecido, mas a etapa de compilação precisa que o código seja gerado como independente de posição na memória, e a junção de múltiplos módulos na mesma biblioteca se faz através do
ld (ou do
gcc como
front-end para o
ld ).
gcc -fPIC -c arq1.c arq2.c arq3.c
gcc -shared -Wl,-soname,libABCD.so.1 -o libABCD.so.1.0 arq1.o arq2.o arq3.o
ln -s libABCD.so.1.0 libABCD.so.1
ln -s libABCD.so.1.0 libABCD.so
Se você for administrador da máquina, pode eventualmente colocar as bibliotecas num diretório padrão de bibliotecas da sua máquina. Quais são essas diretórios pode variar de uma máquina para outra, de acordo com as regras definidas em
/etc/ld.so.conf , mas comumente prevê um diretório local, como
/usr/local/lib . Nesse caso, você pode copiar suas bibliotecas para lá.
sudo cp -p libABCD.{a,so*} /usr/local/lib/
ldconfig # regenera o cache de bibliotecas, de modo a incluir a nova lib nesse cache
Instalando num diretório padrão, fica fácil usar as bibliotecas.
gcc -static prog.c -lABCD -o prog-static
gcc prog.c -lABCD -o prog-dynamic
Se você não puder ou não quiser instalar as bibliotecas em áreas gerais do sistema, pode especificar o caminho da biblioteca no momento do
linking . No caso de bibliotecas estáticas, isso é muito fácil.
gcc -static prog.c -L/home/fulano/lib -lABCD -o prog-static
Com a biblioteca dinâmica, a ligação é feita em duas etapas: uma no momento da geração do executável (pelo
ld , que pode ser invocado através do
gcc ), e outra a cada vez que o programa for executado (pelo comando
ld.so ). Assim sindo, você precisa embutir no execuável as informações necessárias para que o
ld.so encontre as bibliotecas na hora da execução.
gcc prog.c -L/home/fulano/lib -Wl,-rpath,/home/fulano/lib -lABCD -o prog-dynamic
Se você pretende distribuir um executável que dependa de uma biblioteca dinâmica, tem de distribuir a biblioteca também. Para tanto, existem duas opções principais. A primeira é você criar um pacote (.rpm, .deb ou similar) que instale a biblioteca num dos diretórios padronizados e regenere o cache, e num outro pacote distribuir sua aplicação.
A outra opção é colocar a biblioteca junto com o executável, e fazer com que o executável procure a biblioteca no mesmo diretório em que ele estiver instalado, ou algum diretório relativo ao local onde ele estiver instalado. Isso se consegue por meio da macro “
$ORIGIN ” passada como argumento da opção
-rpath do linker.
gcc prog.c -L/home/fulano/lib -Wl,-rpath,'$ORIGIN'/../lib -lABCD -o prog-dynamic
# Se prog-dynamic for instalado em /home/fulano/bin, vai procurar a biblioteca
# em /home/fulano/lib. Se for instalado em /opt/teste, vai procurar em /opt/lib.