Resolver dependências circulares vinculando a mesma biblioteca duas vezes?
Temos uma base de código dividida em bibliotecas estáticas. Infelizmente, as bibliotecas têm dependências circulares; por exemplo.,libfoo.a
depende delibbar.a
e vice versa
Eu sei que a maneira "correta" de lidar com isso é usar o @ do vinculad--start-group
e--end-group
opções, assim:
g++ -o myApp -Wl,--start-group -lfoo -lbar -Wl,--end-group
Mas em nossos Makefiles existentes, o problema geralmente é tratado assim:
g++ -o myApp -lfoo -lbar -lfoo
(Imagine isso estendido para ~ 20 bibliotecas com interdependências complexas.)
Passei por nossos Makefiles alterando a segunda forma para a primeira, mas agora meus colegas de trabalho estão me perguntando o porquê ... E além de "porque é mais limpo" e uma vaga sensação de que a outra forma é arriscada, eu não tem uma boa resposta.
Então, pode vincular a mesma biblioteca várias vezessempr criar um problema? Por exemplo, o link poderia falhar com símbolos de definição múltipla se o mesmo .o for puxado duas vezes? Ou existe algum risco de acabar com duas cópias do mesmo objeto estático, criando bugs suti
Basicamente, quero saber se existe a possibilidade de falhas no tempo do link ou no tempo de execução vincularem a mesma biblioteca várias vezes; e se sim, como ativá-los. Obrigado