Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.251.22] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
jack128, ну не надо, плз. Ты-то уж должен понимать, что уж линкеры точно не имеют никакого отношения к представлению сущностей в исходном коде. Влияние исходного кода заканчивается после его обработки компилятором, что как раз и позволяет влёгкую связывать объектные модули от разных языков.
|
Сообщ.
#17
,
|
|
|
Цитата Qraizer @ .. Не можешь обеспечить разделение сущностей по уникальным именам, получишь UB. А то, что их можно разделить динамической загрузкой, никому не новость, вот только jack128 это не устраивает. Какое то море слов - и никакого результата. Никакого UB при загрузке dll с одинаковым именем функции не будет. Если мы определяем адрес функции сами, тогда про UB и речи нет. (Определяем адрес функции - а не загружаем dll.) Если не сами - тогда обращение к функции также является вполне определённым. #pragma comment(lib,"SomeDll1.lib") #pragma comment(lib,"SomeDll2.lib") При таком исходнике, функция с проблемным именем будет вызвана из SomeDll1.lib - SomeDll1.dll Если #pragma comment(lib,"SomeDll2.lib") #pragma comment(lib,"SomeDll1.lib") тогда функция с проблемным именем будет вызвана из SomeDll2.lib - SomeDll2.dll Кто первый - того и тапки. Поведение программы точно определено, никакого конфликта не будет. Но доступ, конечно, будет только к одному экземпляру функции, поскольку имя одно. --- Даже удивительно - решение есть, займёт оно 2-3 строки (и 2-3 минуты), как и в Дэлфи. И гораздо меньше, чем вся это бессмысленная переписка. Уж и не знаю, что тогда ещё нужно. Добавлено Цитата Qraizer @ Если нет, то попробуй слинковать с приложением две функции с одинаковыми именами из разных библиотек. Простых lib, не dll. Хочешь тестов? При чём тут простые lib-ы ? И вообще, практика - критерий истины. Две dll с совпадающим именем функции статически слинковать можно. --- Кстати, IAR-C позволяет назвать свою функцию стандартным именем. И, тем самым, заменить своей функцией стандартную из библиотеки. Что бывает очень полезно. Так что и с обычными либами всякое бывает. |
Сообщ.
#18
,
|
|
|
А WinAPI то каким образом имеют ?? Уж в крайнем случае - формат PE/виндовый загрузчик. Которые позволяют в самом exe в явном виде прописать какие dll и какие функции из этих dll этому exe нужны. Это плохо ???
|
Сообщ.
#19
,
|
|
|
jack128, позволь напомнить, что такое DLL. Это – внезапно – библиотека, в которой лежат сущности кода, используемые приложением в работе. Позволь напомнить, на кой хрен они вообще появились. В 1985г. Microsoft выпустила Windows 1.0 с системными требованиями Intel 8088 или совместимый, два 5-и дюймовых флоппи-привода на 320Кб каждый и 256Кб RAM. Даже без HDD. И в таких условиях она должна была работать. Экономия системных ресурсов была первоочередной задачей, т.к. в 256Кб рядом с системой помещался разве что калькулятор. Потому все приложения были оверлейными и перемещаемыми по памяти, а DLL должны были серьёзнейшим образом уменьшить требования к библиотекам за счёт использования одной такой библиотеки сразу всеми запущенными приложениями. В конце концов, все RTL одного и того же языка всегда одинаковы, и экономия памяти за счёт избавления от её дубликатов – это первое, что приходит в голову.
Не надоел экскурс в историю? Возможно нынче никто не задумывается, я зря, о том, что DLL – это просто библиотека. Она всего лишь не влинкована в тот же исполняемый модуль, что и приложение, и долинковывается к нему загрузчиком ОС. Единственным предназначением DLL было экономить ОЗУ, создавая при этом приложению полную иллюзию того, что с перехода со статических либ на динамические ничего не изменилось. Вот так создавался WinAPI. Экспорт имён из DLL ничем не отличается от глобальных имён из LIB, в том и была идея, чтобы борьба за ресурсы ОЗУ осталась под капотом ОС, а не головной болью программиста. Всё остальное, что нынче DLL могут предложить, суть просто дальнейшее развитие идеи разделения одного приложения на несколько исполняемых модулей. Если у тебя две разные функции оказались названы одинаково, DLL тут ни причём, LIB на их месте сделали б точно такую траблу. Нынче легко рассуждать о квалификации, которую несложно встроить в куда-либо. Напомню, в 1985 году програмили на C, Pascal и в общем-то и всё. Там не было и до сих пор нет никакой дополнительной квалификации имён, без которой решить указанную проблему конфликта имён невозможно. При всём желании WinAPI сделать по другому было нельзя. А что касается MS, то ещё в 90-ых она взамен структурного API предложила объектный COM. Там проблем с квалификацией изначально нет, даже на C, пользуйтесь на здоровье. Хочется кого-то обвинить в том, что пользуете устаревшую технологию, обвиняйте себя, адекватное решение уж 30 лет как предоставлено. Добавлено Цитата jack128 @ Это не плохо. И даже более того, это так и сделано. Вопрос-то не в этом, вопрос в том, как это описать на уровне исходных текстов, чтобы компилятор создал правильные ссылки для линкера, а тот для загрузчика ОС. На C ты это никак не сделаешь, только динамически через указатели. Но это очевидное решение не подходит, уж не знаю, почему. На Плюсах, Дельфях, Питонах и тому подобной вакханалии это можно сделать, осталось малось: придумать, как реализовать и стандартизировать. Что там нынче с Дельфями сотоварищи, ябеспонятия, но Комитет по Плюсам всегда открыт для предложений. Которые позволяют в самом exe в явном виде прописать какие dll и какие функции из этих dll этому exe нужны. Это плохо ??? |
Сообщ.
#20
,
|
|
|
Забавные ребята, эти индусы. Я уж забывать стал, каково с ними общаться. Саппорт проблему признал, перекинул на команду разработчиков, а те в упор не понимают, в чём трабла. Или прикидываются, чтоб отстали.
jack128, посмотри, плз, трэд. Я там по их просьбе приложил простейший пример ситуации. Пришлось выдумать предысторию, правда. Я-т хоть правильно его там описал? Бо мои фантазии могут неправильно отражать вашу реальность. |
Сообщ.
#21
,
|
|
|
Ну да, всё правильно описано.
Это Цитата There is nothing to fix in LIB.exe or LINK.exe, both working as expected. меня конечно убивает. |
Сообщ.
#22
,
|
|
|
Ну, они просто не знают, кто с ними разговаривает. Они привыкли общаться с другими разработчиками или там тестировщиками, и кто такие верификаторы, возможно, не подозревают. Для верификатора мнение разработчика пустой звук, он ориентируется на документацию. Есть несоответствие – пусть исправляют. Что-нибудь, неважно, лишь бы одно соответствовало другому. (Хотя, лучше б, конечно, lib.) 10 лет назад приходилось и не такие ребусы разгадывать, с использованием индусского английского.
|
Сообщ.
#23
,
|
|
|
jack128
Не хочешь динамическую загрузку - заставь ОС это сделать за тебя Сделай свою пустую DLL, имена функциям дай разные и форварди в нужные библиотеки. Пример в аттаче. Прикреплённый файлtest.zip (88,03 Кбайт, скачиваний: 63) |