При создании DLL-файла содержит ли сгенерированный LIB-файл имя DLL? - PullRequest
11 голосов
/ 25 января 2009

В Visual C ++, когда я собираю dll, выходные файлы - это .dll и .lib.

Имя библиотеки DLL, встроенной в файл .lib.

Причина, по которой я задаю этот вопрос: Когда я собрал свой exe-файл, импортировав его и запустив exe, exe пытается найти dll, чтобы загрузить его в адресное пространство процесса.

Поскольку мы просто указываем имя библиотеки (файл .lib) в свойствах проекта, как исполняемый файл узнает имя библиотеки DLL.

Примечание: я выгрузил файл библиотеки libbin (.lib) и увидел, что в нем нет имени dll.

Ответы [ 3 ]

17 голосов
/ 25 января 2009

Файл LIB превращается в таблицу импорта в EXE. Это содержит имя DLL.

Вы можете увидеть это, если вы запустите dumpbin /all MyDLL.lib. Обратите внимание, что dumpbin MyDll.lib само по себе не показывает ничего полезного: вы должны использовать /all.

Здесь показаны все разделы, определенные в файле .LIB. Вы можете игнорировать любые .debug разделы, потому что они не будут присутствовать в сборке Release. В файле .LIB есть коллекция разделов .idata. В только что созданном проекте DLL файл LIB содержит раздел .idata$4, в котором определены символы, которые должны быть помещены в таблицу импорта EXE-файла, включая имя DLL:

Archive member name at 83E: MyDll.dll/      
497C3B9F time/date Sun Jan 25 10:14:55 2009
         uid
         gid
       0 mode
      2E size
correct header end

  Version      : 0
  Machine      : 14C (x86)
  TimeDateStamp: 497C3B9F Sun Jan 25 10:14:55 2009
  SizeOfData   : 0000001A
  DLL name     : MyDll.dll
  Symbol name  : ?fnMyDll@@YAHXZ (int __cdecl fnMyDll(void))
  Type         : code
  Name type    : name
  Hint         : 2
  Name         : ?fnMyDll@@YAHXZ
2 голосов
/ 25 января 2009

Да, библиотека содержит имя библиотеки DLL.

Функционально библиотека импорта реализует вызовы LoadLibrary и GetProcAdress и делает экспортированные функции доступными, как если бы они были связаны статически.

Путь поиска такой же, как документировано для LoadLibrary , хотя имя является фиксированным.

0 голосов
/ 29 сентября 2015

Как указали Роджер и Питер, да .Lib-файл содержит имя .dll-файла. И спасибо Роджеру за то, что он указал, что dumpbin показывает имя файла .dll, это помогло мне решить мою проблему. Относится к тому, откуда взято имя в файле .lib.

Я ожидал, что имя будет взято из настроек проекта для проекта dll, но у нас был файл export.def, в котором было указано имя для dll. Так что у нас были проблемы с использованием нашей dll, когда я изменил настройки проекта, но не export.def. Решением для нашего проекта было удаление файла export.def.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...