Когда включать .lib и когда включать .dll или оба - PullRequest
4 голосов
/ 26 января 2010

Я получил файл .h, два файла .lib, файл .dll и крошечный тестовый проект от поставщика оборудования для общения с их оборудованием.

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

Для начала я просто скопировал коммуникационные части их кода (подключите, отключите и отправьте команду) в свой проект. Это на самом деле все, что вы можете сделать. Я включил файл .h и указал на каталог, содержащий файлы .lib. Как в крошечном тестовом проекте. Все компилируется, но когда я пытаюсь запустить проект, жалуется, что в нем отсутствует файл .dll.

Кто-нибудь может объяснить, что происходит? Как должны работать библиотеки и библиотеки?

Все это на windows VS2005. Я сравнил файлы .vcproj и не смог найти никаких существенных отличий.

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Тестовый проект статически связан - библиотека включена в exe.

Ваш проект динамически связан - на dll ссылаются, и поэтому он необходим во время выполнения.

См. Вопрос переполнения стека для получения дополнительной информации.

2 голосов
/ 26 января 2010

В основном ответ зависит от того, собираетесь ли вы использовать статические или динамические ссылки для вашего исполняемого файла.

При статической компоновке вам нужны файлы .h и .lib, но не файлы .dll для компиляции и компоновки. Ваш исполняемый файл будет больше, но вам не понадобятся файлы .h / .lib / .dll во время выполнения.

Для динамической компоновки вам просто нужны файлы .h для компиляции и компоновки. Ваш исполняемый файл будет меньше, но вам понадобится один или оба DLL-файла во время выполнения.

Для более подробного рассмотрения этого с точки зрения Visual Studio, посмотрите http://msdn.microsoft.com/en-us/library/1ez7dh12.aspx -

"Динамическое связывание отличается от статического связывания тем, что оно позволяет исполняемому модулю (файлу .dll или .exe) включать только информацию, необходимую во время выполнения, чтобы найти исполняемый код для функции DLL. компоновщик получает все ссылочные функции из библиотеки статических ссылок и помещает их вместе с вашим кодом в исполняемый файл. "

...