Как динамическое связывание реагирует на изменение объекта - PullRequest
0 голосов
/ 25 сентября 2018

Я скомпилировал компонент (скажем, X.exe), связанный с динамической библиотекой (скажем, Y.dll).X и Y были освобождены.

Теперь я сделал небольшое изменение в функции объекта, которое сохраняется Y: у меня есть delete утечка объекта и указатель на него NULL.

Чтобы применить это изменение с полной совместимостью, что мне делать?

  1. Необходимо перекомпилировать компонент X с новым библиотечным файлом и также необходимо заменить DLL;

  2. Перекомпиляция X с помощьюбудет достаточно нового файла библиотеки;

  3. Замена библиотеки DLL будет достаточно.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Теперь я сделал небольшое изменение в функции объекта, которое содержит Y

Что за изменение? Только если вы изменили сигнатуру метода и X.exe зависит от этого метода , вы должны перекомпилировать компонент X с новым файлом библиотеки и также необходимо заменить DLL , В противном случае , Замена библиотеки DLL будет достаточно .

0 голосов
/ 25 сентября 2018

Теперь я внес небольшое изменение в функцию объекта, которую держит Y.

Что нужно сделать, зависит от того, какие именно изменения вы сделали.Для таких типов ситуаций мы можем различать два типа изменений: изменения, нарушающие ABI, и изменения, совместимые с ABI.

ABI (двоичный интерфейс приложения) - это интерфейс скомпилированногообъект как бинарный уровень.Аналогично тому, как функции C ++ имеют API (например, сигнатуры функции являются частью API), скомпилированный машинный язык имеет ABI, который зависит, помимо прочего, от API и соглашения о вызовах.

Знание того, что изменяетсянарушают ABI и не могут быть трудной задачей.Но, как правило:

  • , если вы не изменили API Y, ABI Y не изменится;
  • если вы изменили API Y, ABI Y изменится.

Теперь, если вы нарушили ABI Y, вы должны выпустить его новую версию (назовем его Y-2).X не будет совместим с Y-2 и потребует обновления (опционально) и перекомпиляции (обязательно) и выпуска в качестве новой версии (назовем это X-2).X и Y-2 не совместимы с ABI.X-2 и Y не совместимы с ABI.

Если ABI Y не тронут, вы можете безопасно распространять новую версию Y (назовем ее Y-1.1), которая заменитY на целевых компьютерах и ссылка с оригиналом X.

Из комментария видно, что:

Я сделал только одно удаление: утечка объекта исделал это в NULL.

Это ни API, ни ABI не нарушают.Вы можете безопасно распространять только Y-1.1.

0 голосов
/ 25 сентября 2018

Это зависит от изменений, которые вы внесли в исходный код DLL.Если есть какое-либо добавление / удаление функции, вам нужно выполнить шаг 1. Если в теле функции только исходный код DLL изменяется, то шаг 3 будет работать.Шаг 2 не применим, так как в любом случае вам необходимо заменить новую DLL.

...