Caminhos relevantes para compilar a partir da fonte

2

Eu sou novo no desenvolvimento de software, e ao longo da compilação de cerca de 20 programas e dependências a partir da fonte, eu vi um padrão difícil, mas eu não entendi bem. Eu espero que você possa lançar alguma luz sobre isso.

Estou usando o SSH em uma máquina SLC6 e sem permissões de root, tenho que instalar todas as dependências de software e a parte mais difícil - LIGÁ-LO no lugar certo.

Por exemplo: eu preciso instalar o log4cpp. Eu faço o download de um tarball e descompacte-o

./autogen.sh (if there isn't this one, just continue to next)
./configure
make

Portanto, ele é instalado na própria pasta juntamente com o código-fonte, ficando apenas dormente lá, até que eu possa chamá-lo da maneira correta.

Depois, há um outro programa que eu preciso instalar, e ele requer que eu especifique o lib e inclua dirs para algumas dependências

--with-log4cpp-inc=
--with-log4cpp-lib=

Para algumas compilações de fontes, a pasta tem um lib, bin e inc ou inclui dir - Perfeito! Para alguns, a pasta tem apenas lib e inc dir. Para alguns, a pasta tem apenas inc dir.

Eu não tenho nenhum problema quando todos eles têm uma boa pasta, fácil de encontrar. Mas muitas vezes eu me deparo com problemas, como com o log4cpp.

locate log4cpp.so

retorna nulo (O lib dirs tem arquivos .so nele? Ou eles?)

Então eu tenho um problema, nesta instância específica, que o diretório da biblioteca está faltando e não consigo encontrá-lo. Mas eu quero saber como resolver o problema toda vez, e também tenho alguma informação de fundo. No entanto, minhas habilidades de googling parecem não retornar nada ao procurar como as variáveis de ambiente library, include e bin funcionam. Eu também tentei procurar a documentação para o programa, mas parece que as perguntas que tenho: "Onde é o diretório lib, onde está o diretório include, onde está o bin dir?" são tão triviais que nem precisam comunicá-lo.

Então:

  • O que é um diretório de inclusão, o que ele contém, como posso encontrá-lo.
  • O que é um diretório da biblioteca, o que ele contém, como eu o encontro - sempre - comandos úteis, talvez.
  • O que é um diretório binário, o que ele contém, como posso encontrá-lo.
por Heine Nørby 29.10.2014 / 16:45

2 respostas

1

Arquivos de biblioteca geralmente são prefixados com lib ; Seu comando locate pode ter sido mais bem-sucedido se você fosse menos específico: locate "*log4cpp*" .

Com relação às bibliotecas compartilhadas (isto é, .so files - normalmente, mas não necessariamente, o caso; consulte "O que é uma pasta da biblioteca?" abaixo) whereis normalmente encontrará o caminho apropriado, mas não suporta globbing, então você teria que ter o nome correto, sem sufixo ( whereis liblog4cpp ). ldconfig -p é ainda melhor, porque você está obtendo as informações diretamente da boca do cavalo ( ldconfig configura o cache usado pelo vinculador, que gerencia as bibliotecas compartilhadas).

ldconfig -p | grep log4cpp

Note que, para construir na biblioteca, você também precisa do cabeçalho de inclusão relevante, que provavelmente não é instalado por padrão pela distro; aqueles vêm em pacotes -dev ou -devel separados.

O que é um diretório de inclusão?

Um diretório de inclusão contém arquivos de cabeçalho C e C ++ usados dessa maneira no código-fonte:

#include <foobar.h>
#include <foo/bar.h>

Eles são organizados em hierarquias, algumas das quais são estipuladas por padrões de linguagem (C / C ++). No entanto, o caminho para o topo da hierarquia é específico para o sistema e conhecido pelo compilador / pré-processador. Por exemplo, esses dois arquivos podem ser encontrados em /usr/include/foobar.h e /usr/include/foo/bar.h .

Os sistemas Linux geralmente possuem dois diretórios include de nível superior em reprodução, /usr/include e /usr/local/include (o último tem precedência).

Os arquivos de inclusão não são necessários para o software compilado, apenas para criá-los, e é por isso que instalar o libfoobar de um pacote de distribuição irá obter libfoobar.so mas não foobar.h . Isso está no pacote libfoobar-dev (as convenções de nomenclatura do nb variam um pouco nas distribuições).

O que é um diretório de biblioteca?

Um diretório de bibliotecas contém bibliotecas de dois formulários, dinâmico (também conhecido como compartilhado) e estático. A maioria deles é o primeiro. Eles correspondem aproximadamente para incluir diretórios, mas geralmente há mais deles ( /lib , /lib64 , /usr/lib , /usr/local/lib , etc .; alguns deles podem ser links simbólicos para outros).

Uma biblioteca compartilhada é aquela que é usada em tempo de execução; Se um executável vincula a uma biblioteca compartilhada, (partes de) ambos são carregados na memória conforme necessário para que o programa seja executado. Se algo já estiver usando a biblioteca, ela já estará na memória e não precisará ser carregada novamente; os dois aplicativos não interferirão entre si, pois a parte compartilhada é somente leitura para eles. Bibliotecas compartilhadas por convenção usam o sufixo .so .

Uma biblioteca estática é construída em um executável em tempo de compilação e não é necessário executar o executável posteriormente. Isso é menos comum porque a biblioteca não pode ser compartilhada com outros aplicativos, o que potencialmente desperdiça uma quantidade considerável de RAM. Bibliotecas estáticas por convenção usam o sufixo .a .

O que é um diretório binário?

Um diretório binário contém arquivos de programas executáveis, como ls ou firefox . Executáveis no mundo * nix não usam sufixos. Esses diretórios geralmente estão na variável $PATH , caso contrário você teria que digitar /usr/bin/ls o tempo todo. Qual executável será usado quando você digitar ls pode ser determinado com o comando whereis ou which .

Se .configure permitir que você especifique uma biblioteca ou um diretório de inclusão, você normalmente só precisa fazê-lo se estiver em um local não padrão. Experimente sem e se não estiver encontrado e use a opção --with-inc= .

    
por 29.10.2014 / 17:15
1

O processo padrão ao instalar um pacote a partir da fonte é o seguinte:

  1. ./configure
  2. make
  3. Opcional: make test ou make check
  4. make install

Em uma distribuição binária como o Debian ou Fedora, os quatro comandos acima são executados em um local central e depois empacotados pelos mantenedores de distribuição para serem liberados para o público, onde os usuários os baixam como atualizações ou novos pacotes no gerenciador de pacotes. Em uma distribuição baseada em código-fonte como Gentoo ou Arch, o gerenciador de pacotes executa os 4 comandos listados, na ordem listada.

Em ambos os casos, cabe ao software gerenciador de pacotes do seu sistema gerenciar as dependências que estão sendo rastreadas se o seu sistema tiver uma, caso contrário, a etapa 4. Quando a Etapa 4 for executada, os libdirs e os bindirs podem ser encontrados pelos scripts de configuração para todos os outros pacotes que você compila.

    
por 29.10.2014 / 17:09