Instalar biblioteca própria em C no debian [RESOLVIDO]

1. Instalar biblioteca própria em C no debian [RESOLVIDO]

Paulo Batista da Costa
costabatista

(usa Debian)

Enviado em 10/08/2018 - 19:15h

Olá pessoal, estou com uma dúvida a respeito de bibliotecas em C. Eu criei uma biblioteca em C personalizada para manipulação de strings. Eu compilo e a uso normalmente sem qualquer problema. No entanto, por curiosidade, gostaria de saber como instalá-la no meu sistema operacional. Em outras palavras, gostaria de acessar funções e macros da mesma forma que faço acesso para as bibliotecas padrões, apenas dando aquele '#include<stdio.h>'. No caso, minha biblioteca se chama 'stringlib', gostaria de poder incluí-la da mesma forma, ou seja, '#include<stringlib.h>'. Acredito que preciso colocar o cabeçalho na pasta include do sistema, mas fiquei com dúvida a respeito do arquivo compilado e do código-fonte referente à biblioteca propriamente dito. Alguém para me dar alguma luz nesse processo? Desde já, agradeço a atenção dos membros do fórum.


  


2. Re: Instalar biblioteca própria em C no debian [RESOLVIDO]

Fernando
phoemur

(usa Debian)

Enviado em 10/08/2018 - 20:45h

Os seus headers devem ficar na pasta include do sistema.
Os arquivos compilados (*.so) devem ficar na pasta lib do sistema (ou lib64)

Como você deve suspeitar, esses locais não são muito padronizados, pode ser /usr/include, /usr/local/include, /usr/lib , /usr/lib64, /usr/local/lib64 e por aí vai...

Dessa forma as distribuições linux usam geralmente o pkg-config para sinalizar ao sistema o local onde está instalada sua biblioteca na hora de fazer a linkagem....

Dessa forma você deve criar um arquivo para o pkg-config, geralmente em /usr/share/pkgconfig
Aqui o exemplo para o arquivo eigen2.pc
Name: Eigen2
Description: A C++ template library for linear algebra: vectors, matrices, and related algorithms
Requires:
Version: 2.0.17
Libs:
Cflags: -I/usr/include/eigen2



Se você quer usar sua biblioteca com CMake, você também precisa fazer um arquivo (*.cmake) para o cmake,
de forma que quando você instruir um find_package(MyLib REQUIRED) o cmake ache sua biblioteca.

Enfim, apenas jogar o arquivo *.h em /usr/include e os *.so em /usr/lib até pode funcionar na sua máquina, porém você deve ter algumas precauções se quiser garantir a portabilidade.

Recomendo esse link (porém é C++) : https://stackoverflow.com/questions/17511496/how-to-create-a-shared-library-with-cmake


______________________
https://github.com/phoemur


3. Re: Instalar biblioteca própria em C no debian

Paulo
paulo1205

(usa Ubuntu)

Enviado em 11/08/2018 - 16:20h

Resposta “tradicional” (no sentido de ser mais ou menos assim desde os anos de 1990 e em diversos sistemas UNIX-like)

Coloque o(s) cabeçalho(s) em /usr/local/include e a(s) biblioteca(s), tanto em forma .a quanto .so em /usr/local/lib (e/ou /usr/local/lib32 e/ou /usr/local/lib64), pois muitos compiladores vêm pré-configurados para buscar cabeçalhos também em /usr/local/include e muitos linkers (incluindo o de ligação de bibliotecas dinâmicas) para buscar bibliotecas em /usr/local/lib{,32,64}.

Se a sua distribuição/SO em particular não tiver esses defaults no compilador e no linker, você geralmente pode acrescentar opções de linha de comando para tratar tais diretórios de modo semelhante aos diretórios padronizados de busca. Para cabeçalhos, tipicamente seria algo como “-I/usr/local/include”. Para bibliotecas estáticas, você pode listar o caminho completo da biblioteca ou, para uma biblioteca contida num arquivo com nome libABCXYZ.a, algo na forma “-L/usr/local/lib -lABCXYZ”. Para bibliotecas dinâmicas, alguns linkers usam diretórios padronizados, configuráveis por meio de um arquivo como /etc/ld.so.conf ou /etc/ldconfig.conf ou assemelhado.

Você poderia ainda usar para suas bibliotecas dinâmicas um local (ou vários) não padronizados e não incluir tais locais no arquivo de configuração do run-time loader (RTLD). Nesse caso, o usuário teria de embutir a informação sobre o local onde a biblioteca deve ser buscada na hora de gerar o executável, através de opções para o linker tais como “-R” ou “--rpath”.


Resposta mais “moderna”

Você talvez queira preparar um pacote de instalação para sua biblioteca, à semelhança do sistema de pacotes nativo de sua distribuição e/ou os de outros sistemas para os quais você queira disponibilizar sua biblioteca (DEB, RPM, PKG, APK, Snap etc.). Com isso, o próprio sistema de pacotes escolheria o local de instalação, e seus cabeçalhos e bibliotecas poderiam residir com os demais cabeçalhos e bibliotecas mantidos pelo sistema. O esforço para o usuário seria mínimo, pois não precisaria de nenhuma das opções mencionadas acima para incluir cabeçalhos nem bibliotecas estáticas nem dinâmicas.

O preço a pagar por isso é que o esforço passa para você, autor e/ou mantenedor da biblioteca. Cada um desses sistemas de pacote tem seu próprio conjunto de regras, não apenas sobre onde instalar os arquivos a serem distribuídos, mas também até da forma de compilá-los. Você vai ter de dançar conforme as músicas que achar que convêm para você e para seu público alvo.

Nosso colega Phoemur deu algumas sugestões que, no meu entendimento, podem ir um pouco na linha oposta. Não que elas sejam mutuamente excludentes, mas trabalhar com pkg-config acaba sendo mais útil para situações em que o ambiente possa não ser totalmente homogêneo. Se todos os cabeçalhos estiverem no mesmo lugar e, de modo semelhante, todas as bibliotecas estiverem no mesmo lugar, a saída das opções de compilação será sempre a mesma. Ademais, pkg-config é parte do Free Desktop, não parte nativa de nenhum sistema UNIX-like.

Isso não quer dizer que eu advogue contra pkg-config, cmake, autoconf ou ldtool. Muito ao contrário: acho têm seu valor. Mas podendo simplificar, prefiro simplificar.


4. Instação de biblioteca própria em C no debian

Paulo Batista da Costa
costabatista

(usa Debian)

Enviado em 24/08/2018 - 14:25h

Pesssoal, muito obrigado. Consegui. Resolvido.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts