Ага. А там лежат несколько версий одной и той же библиотеки и линкер впадает в ступор перед проблемой выбора. Да память не резиновая вроде как...Цитата:
Сообщение от elf/2
Спасибо, буду искатьЦитата:
Сообщение от maximk
Вид для печати
Ага. А там лежат несколько версий одной и той же библиотеки и линкер впадает в ступор перед проблемой выбора. Да память не резиновая вроде как...Цитата:
Сообщение от elf/2
Спасибо, буду искатьЦитата:
Сообщение от maximk
Все гипотетические примеры очень хорошие. :)Цитата:
Сообщение от elf/2
Ну что тут сказать?
У каждого подхода есть недостатки.
С одной стороны, если целостность не контролируется - получается DLL hell. Если есть контроль версий - получаем несовместимость потенциально совместимого кода.
Контроль по сигнатурам - это некоторое промежуточное решение. И наследует достоинства и недостатки обоих подходов. Если это иметь ввиду, то подход весьма практичен. ;)
Самое главное в списке - то что из него можно так или иначе получить указатели на функции плагинов и вызывать их.Цитата:
Сообщение от elf/2
Можно искать файлы по маске, загрузить их, и добавить в список. Но они могут не влезть в память.
Ещё можно вообразить пользователя с одним дисководом. У него есть дискета с графическим редактором и плагинами. Он запускает редактор и автоматически загружаются плагины которые он настроил. Но все плагины не помещаются на дискету, и иногда он загружает плагины, которые хранятся на другой дискете. А ещё у него есть дискеты с его картинками. Не получится просто искать файлы в каталоге по маске. :)
А чего искать, читай, думаю будет полезно.Цитата:
Сообщение от Vitamin
блин, dll hell к целосности отношение имеет слабое. проблема в том что в свое время MS рекомендовала складывать все dll в папочку %windir%\system. при установке двух программ использующих одну библиотеку разных версий побеждала последняя. инсталятор мог проверить только дату/время изменения файла.Цитата:
Сообщение от captain cobalt
для борьбы с этим добавили version_info, чтобы опять же инсталятор мог грамотно сообщить пользователю что происходит и положить библиотеку в папку к программе откуда она будет грузиться в первую очередь
для того чтобы hell'а не было достаточно иметь возможность хранить несколько версий библиотеки на одной машине. это работает в linux и .net
а вы так не делайте :) кстати наличие реестра с общим списком всех библиотек в системе от всего этого не спасаетЦитата:
Сообщение от Vitamin
точно, но вот только где в таком случае будет лежать "реестр"? и как он поможет разрешить проблемуЦитата:
Сообщение от captain cobalt
тогда просто ради коллекции ссылка на описание формата obj файлов от MS OMF (relocatable object module format):Цитата:
Сообщение от caro
http://www2.cs.uh.edu/~mirkovic/cosc2410/omf1_1.pdf
Чтобы использовать перегруженные функции, нужно руками прописывать сигнатуры в клиентском коде.Цитата:
Сообщение от Vitamin
Утилита, делающая из исходников исходники - это компилятор. Лучше сразу обучить её делать объектные файлы. Тогда "старые ассемблеры" можно отбросить. :)Цитата:
Сообщение от Vitamin
Можно ли на спеке позволить себе держать разные версии библиотеки в памяти? Скорее всего нет.Цитата:
Сообщение от elf/2
Поэтому и важно, что если совместимость достаточна - библиотека компонуется. Недостаточна - проблема должна обнаруживаться.
Каждая библиотека должна быть одна.
Пока не ясно.Цитата:
Сообщение от elf/2
Он может лежать на "системном диске", и после загрузки постоянно сидеть в памяти.
Или же каждый кусок может лежать рядом со своей программой в "файле конфигурации".
Есть ещё один способ хранить несколько версий библиотек на одной машине.Цитата:
Сообщение от elf/2
Компоновать программы статически. :)
тоже подкину пару ссылок:Цитата:
Сообщение от elf/2
Вполне можно так делать. Коренным образом поменялась библиотека- меняется имя/версия и она не прилинкуется "куда не надо". А реестр- это бред.Цитата:
Сообщение от elf/2
А чтобы использовать ассемблер надо вообще программы писать ручками! Прикинь, да?Цитата:
Сообщение от captain cobalt
Ну-ну. Никто не выказывал охоты перейти на существующий аласм, зато как только на горизонте нарисуется эфемерный компилятор, так все сразу побегут роняя тапки пользовать его и писать в нем програмы. Уж лучше использовать что есть.Цитата:
Сообщение от captain cobalt
не в памяти, а на диске. соответсвенно когда задаем зависимости от библиотек указываем не только имя но и версию. и компоновщик грузит в память только нужную версиюЦитата:
Сообщение от captain cobalt
"Можно ли на спеке позволить себе держать ... в памяти?" :) нужное вставитьЦитата:
Сообщение от captain cobalt
точно, и добавить в каждую программу парсер конфигурашек... "Можно ли на спеке позволить себе держать ... в памяти?"Цитата:
Сообщение от captain cobalt
вот и я о том. у библиотеки должна быть версия, а не у функции сигнатура. в библиотеке лежат связанные между собой функции и библиотека определяется набором функций.Цитата:
Сообщение от Vitamin
и линковка должна проходить/отваливаться на основе требований программы к версии библиотеки.
при этом не важно как мы эти библиотеки находим. насколько мне известно подход к поиску библиотек у винды/линукса различается, но:
1. можно указать руками где искать при запуске (LD_LIBRARY_PATH)
2. место специфичное для данной программы (каталог где лежит бинарик)
3. общая куча (%windir%\system)
как сейчас модно писать: +1Цитата:
Сообщение от Vitamin
Я тоже было подумал, что черная кошка пробежала дважды, но ты меня опередил %)Цитата:
Сообщение от elf/2
Единственное что полезное вытащил из идей captain cobalt'а- это версионирование на уровне функций, а не модулей целиком. Но это только если будет возможность раздербанивать библиотеки, вытаскивая нужные функции. В противном случае это не имеет смысла.