Lib и DLL, ссылающиеся на exe-ошибку "не может прочитать в 0x300" - PullRequest
12 голосов
/ 22 декабря 2011

У меня есть общий вопрос о том, как .dll / .libs предполагается использовать. Я создаю .dll для использования в моем проекте, однако, я заметил, что когда я иду к компиляции, мне нужно статически связать .lib, связанный с .dll для проекта, чтобы скомпилировать (в противном случае есть ошибка компоновки "фатальная ошибка LNK1107: неверный или поврежденный файл: невозможно прочитать при 0x300 "). Так что позже, когда я буду повторно распространять свой проект, а затем обновлять его, понадобится ли мне отправлять новый .exe и новый .dll, а не только новый .dll? Если это так, то зачем использовать .dll?

1 Ответ

30 голосов
/ 22 декабря 2011

.Lib содержит заглушки для функций и т. Д., Которые экспортируются DLL. Вы связываете .lib с вашим EXE, и теперь ваш EXE знает, как вызывать функции. Но, конечно, там нет никакой функции - звонки не идут никуда. Во время загрузки, когда операционная система загружает ваш EXE-файл, он также загружает вашу DLL-библиотеку, а затем исправляет EXE-файл - там, где EXE-файл вызывает заглушку, загрузчик заменяет его вызовом на настоящую функцию в DLL.

Обычно вам не нужно отправлять .lib своим клиентам. Однако, если ваши клиенты хотят написать свои собственные EXE-файлы, которые используют вашу DLL, вам нужно будет отправить им .lib, чтобы они могли связать свои EXE-файлы с ним.

Ошибка компоновщика LNK1107 означает, что вы пытались связываться с DLL, а не с .lib. Это всегда неправильно, потому что по определению DLL динамически связана во время выполнения, а не статически во время сборки.

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