Lib и DLL, связанные с ошибкой exe, "не могут читать на 0x300"

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

Ответ 1

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

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

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