На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Статическая линковка 2х dll с одинаков названой функцией
    jack128, ну не надо, плз. Ты-то уж должен понимать, что уж линкеры точно не имеют никакого отношения к представлению сущностей в исходном коде. Влияние исходного кода заканчивается после его обработки компилятором, что как раз и позволяет влёгкую связывать объектные модули от разных языков.
      Цитата Qraizer @
      .. Не можешь обеспечить разделение сущностей по уникальным именам, получишь UB. А то, что их можно разделить динамической загрузкой, никому не новость, вот только jack128 это не устраивает.

      Какое то море слов - и никакого результата.
      Никакого UB при загрузке dll с одинаковым именем функции не будет.
      Если мы определяем адрес функции сами, тогда про UB и речи нет.
      (Определяем адрес функции - а не загружаем dll.)
      Если не сами - тогда обращение к функции также является вполне определённым.
      ExpandedWrap disabled
        #pragma comment(lib,"SomeDll1.lib")
        #pragma comment(lib,"SomeDll2.lib")

      При таком исходнике, функция с проблемным именем будет вызвана из SomeDll1.lib - SomeDll1.dll
      Если
      ExpandedWrap disabled
        #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 позволяет назвать свою функцию стандартным именем.
      И, тем самым, заменить своей функцией стандартную из библиотеки.
      Что бывает очень полезно.
      Так что и с обычными либами всякое бывает.
        А WinAPI то каким образом имеют ?? Уж в крайнем случае - формат PE/виндовый загрузчик. Которые позволяют в самом exe в явном виде прописать какие dll и какие функции из этих dll этому exe нужны. Это плохо ???
          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 @
          Которые позволяют в самом exe в явном виде прописать какие dll и какие функции из этих dll этому exe нужны. Это плохо ???
          Это не плохо. И даже более того, это так и сделано. Вопрос-то не в этом, вопрос в том, как это описать на уровне исходных текстов, чтобы компилятор создал правильные ссылки для линкера, а тот для загрузчика ОС. На C ты это никак не сделаешь, только динамически через указатели. Но это очевидное решение не подходит, уж не знаю, почему. На Плюсах, Дельфях, Питонах и тому подобной вакханалии это можно сделать, осталось малось: придумать, как реализовать и стандартизировать. Что там нынче с Дельфями сотоварищи, ябеспонятия, но Комитет по Плюсам всегда открыт для предложений.
          Сообщение отредактировано: Qraizer -
            Забавные ребята, эти индусы. Я уж забывать стал, каково с ними общаться. Саппорт проблему признал, перекинул на команду разработчиков, а те в упор не понимают, в чём трабла. Или прикидываются, чтоб отстали.
            jack128, посмотри, плз, трэд. Я там по их просьбе приложил простейший пример ситуации. Пришлось выдумать предысторию, правда. Я-т хоть правильно его там описал? Бо мои фантазии могут неправильно отражать вашу реальность.
              Ну да, всё правильно описано.
              Это
              Цитата
              There is nothing to fix in LIB.exe or LINK.exe, both working as expected.

              меня конечно убивает.
                Ну, они просто не знают, кто с ними разговаривает. Они привыкли общаться с другими разработчиками или там тестировщиками, и кто такие верификаторы, возможно, не подозревают. Для верификатора мнение разработчика пустой звук, он ориентируется на документацию. Есть несоответствие – пусть исправляют. Что-нибудь, неважно, лишь бы одно соответствовало другому. (Хотя, лучше б, конечно, lib.) 10 лет назад приходилось и не такие ребусы разгадывать, с использованием индусского английского.
                  jack128
                  Не хочешь динамическую загрузку - заставь ОС это сделать за тебя ;)
                  Сделай свою пустую DLL, имена функциям дай разные и форварди в нужные библиотеки.
                  Пример в аттаче.
                  Прикреплённый файлПрикреплённый файлtest.zip (88,03 Кбайт, скачиваний: 61)
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0296 ]   [ 18 queries used ]   [ Generated: 29.03.24, 07:49 GMT ]