Устранение циклических зависимостей путем двойного связывания одной и той же библиотеки?

У нас есть кодовая база, разбитая на статические библиотеки. К сожалению, у библиотек есть циклические зависимости; например, libfoo.a зависит от libbar.a и наоборот.

Я знаю, что «правильный» способ справиться с этим - использовать параметры компоновщика - start-group и - end-group , например:

g++ -o myApp -Wl,--start-group -lfoo -lbar -Wl,--end-group

Но в наших существующих Make-файлах проблема обычно решается следующим образом:

g++ -o myApp -lfoo -lbar -lfoo

(Представьте, что это расширено до ~ 20 библиотек со сложными взаимозависимостями.)

Я просматривал наши Make-файлы, меняя вторую форму на первую, но теперь мои коллеги спрашивают меня, почему ... И кроме «потому что это чище» и смутного ощущения, что другая форма рискованна, у меня нет хорошего ответа.

Итак, может ли соединение одной и той же библиотеки несколько раз когда-либо создать проблему? Например, может ли ссылка выйти из строя с несколькими определенными символами, если один и тот же .o будет втянут дважды? Или есть риск, что мы можем получить две копии одного и того же статического объекта, создавая небольшие ошибки?

По сути, я хочу знать, есть ли вероятность сбоев во время компоновки или выполнения из-за связывания одной и той же библиотеки многократно; и если да, то как их вызвать. Спасибо.

33
задан JMB 12 September 2018 в 08:22
поделиться