Vinculando com biblioteca dinâmica com dependências
Considere o seguinte cenário:
Biblioteca Compartilhada libA.so, sem dependências.Biblioteca compartilhada libB.so, com libA.so como sua dependência.Eu quero compilar um arquivo binário que vincula com o libB. Devo vincular o binário com libB apenas ou com libA também?
Existe alguma maneira de vincular apenas com as dependências diretas, permitindo a resolução de símbolos não resolvidos das dependências para o tempo de execução?
Estou preocupado com o fato de que a implementação da biblioteca libB pode mudar no futuro, introduzindo outras dependências (libC, libD, libE por exemplo). Eu vou ter problemas com isso?
Em outras palavras:
arquivos libA: a.cpp a.harquivos libB: b.cpp b.hprincipais arquivos de programa: main.cppClaro, b.cpp inclui a.he main.cpp inclui b.h.
Comandos de compilação:
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
Qual das opções abaixo devo usar?
g++ main.cpp -o main -I. -L. -lB
ou
g++ main.cpp -o main -I. -L. -lB -lA
Eu não pude usar a primeira opção. O linker reclama dos símbolos não resolvidos da biblioteca libA. Mas soa um pouco estranho para mim.
Muito obrigado.
- Comentários atualizados:
Quando eu ligar o binário, o linker tentará resolver todos os símbolos do main e do libB. No entanto, libB possui símbolos indefinidos da libA. É por isso que o linker reclama disso.
É por isso que eu preciso vincular com o libA também. No entanto, encontrei uma maneira de ignorar os símbolos não resolvidos das bibliotecas compartilhadas. Parece que eu deveria usar a seguinte linha de comando para fazer isso:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
Parece que ainda é possível usar o-rpath
opção. No entanto, preciso entender um pouco melhor.
Alguém sabe de possíveis armadilhas ao usar o-Wl,-unresolved-symbols=ignore-in-shared-libs
opção?
- Comentários atualizados 2:
-rpath
não deve ser usado para este propósito. É útil forçar uma biblioteca a ser encontrada em um determinado diretório. o-unresolved-symbol
abordagem parece muito melhor.
Obrigado novamente.