Статически связанное приложение - недействительный или поврежденный dll - PullRequest
2 голосов
/ 01 февраля 2010

У меня есть приложение, которое использует классы winInet - #include <afxinet.h> и wininet.dll

Я хотел бы статически связать вызовы функций WinInet в моем приложении и dll, поэтому я выполнил эти шаги . Затем я скопировал файл wininet.dll в каталог моего проекта, прочитав здесь .

При сборке я получаю следующую ошибку - wininet.dll : fatal error LNK1136: invalid or corrupt file

Мой первый вопрос:
-Я правильно делаю то, что я думаю, статически связывает вызовы функций и DLL?
-Если это так, почему dll повреждена при этой настройке, но работает без этих изменений?

Любая помощь приветствуется. Благодарю вас.

Ответы [ 3 ]

3 голосов
/ 01 февраля 2010

«Статическое связывание» - это процесс включения кода в ваше приложение. По своей природе, DLL является динамически подключаемой библиотекой и, следовательно, нет, в том числе DLL в каталоге вашего приложения не является статической связью - она ​​остается динамической. Причина размещения его в каталоге приложения заключается в том, что приложение может найти его без необходимости установки.

Я не думаю, что это «поврежденная» DLL - я подозреваю, что вы пытаетесь статически связать DLL с приложением, что не может произойти. Вместо этого вам нужно включить правильный файл .lib, что бы это ни было, в дополнительные библиотеки, с которыми вы хотите связать и убедиться, что файл lib, с которым вы связываетесь, не является пакетом экспорта DLL для wininet.dll

3 голосов
/ 01 февраля 2010

Вы не должны связываться напрямую с DLL. Вместо этого ссылка на соответствующую библиотеку импорта (должна быть Wininet.lib). Конечно, DLL все еще должна быть доступна для вашего приложения во время выполнения. Файл .lib необходим компоновщику для настройки правильной связи с DLL.

Правильно ли я делаю то, что считаю статически связывающими вызовы функций и DLL?

То, что вы делаете, обычно называется динамическим связыванием (более или менее динамическим ...), но это (afaik) единственный способ использовать системные API Windows. «Статическая» связь привела бы код Wininet непосредственно к вашему исполняемому файлу, без необходимости во внешней DLL.

1 голос
/ 01 февраля 2010

Когда вы связываете с DLL, существует соответствующий файл LIB, который используется для установки правильной связи с функциями. Например, если вы используете USER32.DLL и KERNEL32.DLL, соответствующие LIB, которые должны быть связаны, должны быть USER32.LIB и KERNEL32.LIB.

Иногда это не так очевидно, вы можете проверить дважды, посмотрев на MSDN для рассматриваемой функции, когда вы прокрутите вниз до нижней части этой страницы, она скажет вам, с какой библиотекой связываться, например, посмотрите в Win32API CreateProcess , когда вы смотрите внизу страницы, он говорит вам, какую библиотеку использовать, в данном случае это KERNEL32.LIB.

Вы только что ссылались на DLL во время фазы компоновщика, которую компоновщик не мог понять DLL, поскольку она уже является скомпилированной библиотекой, и, следовательно, компоновщик жаловался, что она «повреждена».

Измените это на WinInet.LIB, и все должно быть в порядке.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...