2009-09-23 4 views
1

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

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

Что касается статических библиотек, я вижу одно большое преимущество: оптимизация времени ссылки. Те, которые были поддержаны ICC и VC++ уже довольно давно, и у GCC есть филиал для них. Поскольку я, вероятно, буду использовать VC++ в Windows, было бы заметное улучшение производительности, как и у компилятора (ну, фактический «компилятор» просто преобразует C++ в промежуточный язык, поэтому компилятор здесь является «компоновщиком») обладает прекрасным знанием кода и может оптимизировать множество вещей таким образом. Это вариант, к которому я склоняюсь.

Мой вопрос: какой из них был бы лучшим в моем конкретном кейсе?

Нет никаких проблем с другими приложениями, использующими их, поскольку я не считаю Linux в этой проблеме (хотя я не знаю OS X) или нескольких экземпляров (кто-то другой же проигрыватель дважды?), Двоичная совместимость (поскольку я буду распространять все с помощью приложения) или просто обновить (в Windows я буду использовать очень эффективный двоичный патч для распространения обновлений).

ответ

0

Я не совсем уверен в вашем конкретном случае.

Если ваш «медиаплеер» предназначен для хорошо знакомого уникального клиента (или небольшого набора клиентов), который будет обновлять весь медиа-плеер сразу или любой данный плагин одновременно под вашим полным наблюдением, я поеду статические библиотеки.

Если это не так, я буду искать динамические библиотеки. Оптимизации хороши, но не так хороши, как удовлетворенность клиентов/пользователей. Нет ничего хуже, чем обновление вашей библиотеки xxx до последней версии и что все внезапные вещи просто перестают работать. Если вы не контролируете, когда и как будут сделаны обновления, вы будете настолько гибкими, насколько сможете.

Ответ на комментарий:

Обычно динамические библиотеки обратно совместим для младших версий выпуска в то время как статическая компоновка может зависеть от конкретной версии и сломаться, если вы пытаетесь связать его с другим выпуском. С динамической привязкой ваша программа может работать даже до тех пор, пока используемые вами вызовы не изменятся, тогда как статическая привязка может зависеть от изменения смещения функции в библиотеке.

Например, статические библиотеки могут быть загружены во время выполнения в адресное пространство процесса со статическим смещением. Разумеется, знание этого смещения допускает определенные оптимизации, но если вы обновляете библиотеку, то либо обновляете ВСЕ плагины с помощью этой библиотеки, либо, возможно, неработающие плагины не будут работать (поскольку смещение функции может очень сильно измениться).

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

+0

Это игрок с открытым исходным кодом. Как динамические библиотеки могут помочь с обновлением? Если вы используете статические библиотеки, как можно обновить свое приложение pdating your xxx до последней версии? Я бы сказал наоборот. – CMircea

+0

Статические библиотеки так же совместимы в обратном порядке, как и общие, поскольку они генерируются из одного источника. Все, что вам нужно сделать, чтобы использовать более новые версии, - это перекомпилировать библиотеки и переосмыслить их - не проблема. Я не вижу, как смещение адресного пространства может повлиять на меня, поскольку плагины будут иметь дизайн обратного вызова (то есть они зависят от приложения, говорящего им делать что-то), и единственной общей зависимостью будет Qt. Возможно, я экспортирую весь общий код приложения в общую библиотеку, чтобы его можно было использовать плагинами, но я не считаю это полезным в этом случае. – CMircea