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.cpp

Claro, 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.

questionAnswers(4)

yourAnswerToTheQuestion