Bibliotecas em Tempo de Execução#

Para ilustrar que até programas simples dependem de bibliotecas de tempo de execução externas, aqui a saída do utilitário ldd que apresenta tais dependências:

$ ldd tabulate.exe
        ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ff88f2b0000)
        KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ff88e450000)
        KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ff88b9e0000)
        cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)
        cyggfortran-5.dll => /usr/bin/cyggfortran-5.dll (0x3efd20000)
        cygquadmath-0.dll => /usr/bin/cygquadmath-0.dll (0x3ee0b0000)
        cyggcc_s-seh-1.dll => /usr/bin/cyggcc_s-seh-1.dll (0x3f7000000)

Outros compiladores ou outras versões do mesmo compilador provavelmente requererá diferentes bibliotecas dinâmicas. Desde que você rode o programa no mesmo computador - ou, mais especificamente, dentro do mesmo ambiente - não haverá problemas. Contudo, quando tal biblioteca não pode ser encontrada, você irá (assim esperado) uma mensagem de erro e o programa para imediatamente.

Portanto é bom sabe quais bibliotecas são requeridas. Nos ambientes Linux e semelhantes, o utilitário ldd é de grande ajuda. No Windows, você pode usar o dependency walker (a última versão, o qual funciona muito bem no Windows 10, é encontrado aqui: lucasg/Dependencies)

Outra coisa que você deve saber é onde o programa tenta achar essas bibliotecas. Isso é um tópico vasto por si só e cheio de complicações e história. Aqui meramente arranhamos a superfície:

No Linux:

  • A biblioteca de ambiente LD_LIBRARY_PATH é usada. Ela consiste em uma lista de diretórios à ser vasculhada, cada diretório separado por dois pontos (:) dos outros. Por instância: usr/lib:/usr/local/lib - tipo sistema de diretórios.

  • Na fase de link você pode usar também a opção de definir RPATH, uma lista de diretórios que é adicionada ao próprio arquivo executável.

  • Então há diversos diretórios do sistemas que serão vasculhados.

No Windows:

  • O diretório contendo o programa executável pode conter também bibliotecas dinâmicas.

  • A variável de ambiente «PATH» é usada. De novo uma lista de diretórios para serem vasculhadas, mas agora o carácter de separação é o ponto-e-vírgula (;).

  • Um conjunto de diretórios de sistema é vasculhado.

Infelizmente, os detalhes podem mudar de uma versão do sistema operação para outra. O supracitado é meramente uma indicação - use ferramentas como «ldd» ou «dependency walker» para descobrir quais bibliotecas são carregas e onde serão encontradas.

Se você quer compartilhar seu programa com colegas ou clientes ou simplesmente usuários ao redor do mundo, você terá que ter cuidado com, além do programa, as distribuição das bibliotecas que seu programa depende. Para mais informações: veja abaixo.