C ++ динамическое связывание зависимостей может вызвать конфликты?

В моем следующем сценарии:

  • Ссылки на библиотеку libA.so libCommon.so
  • Библиотека libB.so также ссылается на libCommon.so
  • хотя обе библиотеки связывают один и тот же libCommon.so, они устанавливают разные конфигурации libCommon.so

             --> libA.so --> libCommon.so
    /
    ProgramA
    \
    --> libB.so --> libCommon.so--> libA.so
    /           \
    ProgramA              --> libCommon.so
    \           /
    --> libB.so
    

Будет ли моя программа использовать одну и ту же копию libCommon.so или использовать другую копию? Как я упоминал ранее, libCommon.so используются с разными настройками. В идеале я хочу, чтобы это было похоже на первую диаграмму, чтобы в libCommon.so были разные копии в памяти. Я пытаюсь избежать звонка, чтобы одна копия влияла на поведение другой стороны.

1

Решение

Краткий ответ: вы получаете вторую диаграмму. И это обычно то, что хотят большинство разработчиков, иначе было бы меньше преимуществ для динамического связывания. Это действительно зависит от реализации libCommon, позволяющей создавать несколько экземпляров в одном и том же процессе — обычно это достигается за счет исключения глобальных переменных в библиотеках для поддержания состояния между вызовами экспортируемых функций.

Поддерживаете ли вы источник для libCommon? Если это так, то найдите способы исправить его, чтобы его использование основывалось на «сессиях», а не на поддержании всех состояний в глобальных переменных.

Если нет, то поддерживаете ли вы исходный код для libA или libB? По сути, вы можете получить первую диаграмму, если статически скомпоновать одну или обе библиотеки libA и libB с libCommon.a вместо libCommon.so, что предполагает наличие статически скомпилированной версии libCommon.a.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector