DLL-проект Visual Studio с зависимостями DLL, неразрешенными внешними символами - PullRequest
0 голосов
/ 05 сентября 2010

Я новичок в понятиях Windows. Я пытаюсь разработать DLL, которая также динамически связывается с другими DLL. Я использую Visual Studio 2010. Во время компоновки Visual Studio сообщает, что пытается связать несколько файлов .lib. Я не думаю, что Visual Studio должна пытаться читать любые файлы .LIB, если я хочу, чтобы мой код выполнял динамическое связывание, это правильно? Или я недостаточно понимаю использование файлов .LIB?

спасибо

Ответы [ 2 ]

4 голосов
/ 05 сентября 2010

Насколько я понимаю, вы немного запутались, потому что хотите использовать библиотеки DLL вместо библиотек.

Хитрость в том, что Kernel32.Lib, User32.Lib, AdvAPI32.Lib и т. Д. не имеют реализации используемой вами функции. Более того, если вы используете такие функции, как CreateFileW или MessageBoxW, в вашей программе ссылки на функцию не будут разрешены после компиляции. Поэтому, не имея LIB, неразрешенные ссылки останутся также в EXE. Это будет плохо по причине. Чтобы быть исполняемым, EXE должен был разрешить все внешние ссылки и, кроме того, точно знать , какие функции должны быть найдены в каких DLL . Так называемая библиотека импорта поможет решить проблему. Например, библиотека импорта Kernel32.Lib содержит информацию о функции CreateFileW, а User32.Lib - информацию о MessageBoxW. Если вы используете список библиотек импорта, таких как Kernel32.Lib, User32.Lib, AdvAPI32.Lib, ваш EXE-файл разрешает все ссылки и включает точный список библиотек DLL, которые ему нужны, и список функций, используемых в соответствующей библиотеке DLL в специальном Таблица импорта (см. http://en.wikipedia.org/wiki/Portable_Executable#Import_Table, http://msdn.microsoft.com/en-us/library/ms809762.aspx и http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx). Итак. Если запустить EXE-файл, операционная система загружает DLL в адресное пространство процесса и разрешается до конец всех ссылок вплоть до адресов всех используемых функций.

Обычно библиотеки импорта создаются компоновщиком ( link.exe ) при компиляции DLL. Также возможно создать библиотеку импорта, которая соответствует DLL в отношении утилиты lib.exe . (см. http://msdn.microsoft.com/en-us/library/0b9xe492.aspx)

1 голос
/ 05 сентября 2010

Насколько я помню, компилятор Visual Studio разрешает файлы .DLL, связываясь с заглушками .LIB-файлов.

Проверьте, один из них должен быть kernel32.lib.

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