Если открытая структура в библиотеке изменяется, обязательно ли перекомпилировать приложение, использующее ее? - PullRequest
2 голосов
/ 13 июня 2011

Существует динамическая библиотека, открытая структура которой изменяется, новые поля добавляются в конец структуры.

Память для структуры выделяется из библиотеки, а приложение не выделяетit.Но приложение может обращаться к членам структуры напрямую.

В этом случае требуется ли приложению повторную компиляцию с библиотекой?

Библиотека используется во всех операционных системах.Системы (Windows, Linux, Solaris, HP-UX и т. Д.).

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

Некоторые библиотеки, такие как FFmpeg, делают что-то подобное.FFmpeg имеет struct AVFrame, чьи sizeof не должны использоваться приложениями, поскольку новые поля могут быть добавлены только с незначительным повышением версии.Библиотека предоставляет функции для выделения struct AVFrame;эти функции не позволяют размещать их массивы.Необходимо позаботиться о том, чтобы не использовать более старую минорную версию, чем приложение, с которым была связана ссылка;не все механизмы разделяемых библиотек поддерживают второстепенные версии.

Я думаю, что это немного уродливо, но если приложения не делают запрещенных вещей, все должно быть в порядке.Более чистый метод - сохранить структуру структур, которые должны быть расширены.

2 голосов
/ 13 июня 2011

В связи с этим условием в вашем вопросе:

Память для структуры выделяется из библиотеки, а приложение не выделяет ее.нужно перекомпилировать приложение.Люди, которые говорят, что вам нужно, просто неправы.

1 голос
/ 13 июня 2011

Если размер структуры не изменяется, перекомпиляция кода не требуется. Вот почему вы часто видите подобные структуры в публичных API:

struct something {
  int public_field1;
  float public_field2;
  char padding[256];
}

Когда добавляются новые поля, они добавляются после public_field2, и размер заполнения уменьшается, так что общий размер остается постоянным.

0 голосов
/ 13 июня 2011

В технической базе KDE есть хорошая статья о двоичной совместимости.

http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++

Я бы сказал, что если структура общедоступна, ее нужно перекомпилировать.Если бы структура была только для внутреннего использования, это не имело бы значения.

...