У нас есть кодовая база, разбитая на статические библиотеки. К сожалению, у библиотек есть циклические зависимости; например, 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 будет втянут дважды? Или есть риск, что мы можем получить две копии одного и того же статического объекта, создавая небольшие ошибки?
По сути, я хочу знать, есть ли вероятность сбоев во время компоновки или выполнения из-за связывания одной и той же библиотеки многократно; и если да, то как их вызвать. Спасибо.