
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.