Подключение динамической библиотеки — несложная операция, которая требует лишь настроек для шагов компиляции, компоновки и запуска программы. Чаще всего настройка одного шага делается одним действием.
Но, прежде чем настроить сборку с библиотекой, эту библиотеку надо найти и загрузить.
Рассмотрим для примера zlib (http://www.zlib.net/). Страница этой библиотеки не очень понятна, но можно найти строку “zlib compiled DLL” для последней версии библиотеки. Архив имеет следующий вид:Но, прежде чем настроить сборку с библиотекой, эту библиотеку надо найти и загрузить.
Найти и обезвредить
Нам нужна библиотечка, весь полезный код которой лежит в “*.dll”. Но откуда компилятор узнает список доступных в DLL функций и способы их вызова?
В самом файле часть информации имеется, но её недостаточно — как минимум, DLL не хранит информацию о типе возвращаемого функцией значения.
Всё это есть в заголовочных файлах, с которыми библиотека была собрана. А для полной сборки проекта в Visual Studio нам нужно скачать архив, содержащий:
- Заголовочные файлы “*.h”
- Файлы с информацией для компоновщика “.lib”
- Файлы с заранее скомпилированной реализацией библиотеки “.dll”
C vs C++
Имеет большое значение язык, на котором написана сама библиотека. Если C, то особых сложностей нет. Если C++, то библиотека, собранная с одним ABI, не будет работать с проектом, который собирается с другим ABI. Кратко про ABI:
- Вот статья на Википедии
- У платформ 32-бит (x86) и 64-бит (x64) разные ABI
- У компилятора MinGW - свой ABI
- У каждой версии и каждой целевой платформы в Visual C++ - свой ABI
- Название используемой платформы можно посмотреть в настройках сборки проекта
Библиотека libz написана на C, так что имеет значение лишь битность — 32 или 64. Библиотека SFML написана на C++, и важно выбрать нужный компилятор и платформу. На странице библиотеки нетрудно выбрать архив со сборкой под Windows и нужную версию Visual Studio.
Правим настройки компиляции проекта
Заголовочные файлы, как обычно, лежат в “include”. Их надо подключить к проекту, но не стоит использовать абсолютные пути, иначе потом на другой машине не соберёте. К счастью, у системы сборки Visual C++ есть удобная переменная “SolutionDir”, которую мы применим:
После этого шага настройки вы сможете использовать “#include <zlib.h>” в своём коде, но при попытке использовать любую функцию получите ошибку стадии компоновки (linker error с кодом ошибки вида “LNK1234”). То есть мы видим объявление функции, но где находится реализация — пока неизвестно.
Если после этого шага ваша программа, использующая zlib, не запустилась — значит, вы что-то напутали в подключении или в своём коде.
После этого шага настройки вы сможете использовать “#include <zlib.h>” в своём коде, но при попытке использовать любую функцию получите ошибку стадии компоновки (linker error с кодом ошибки вида “LNK1234”). То есть мы видим объявление функции, но где находится реализация — пока неизвестно.
Правим настройки компоновки проекта
Реализация всех функций zlib заранее собрана в машинный код и лежит в DLL. Но для компоновки под платформой Windows потребуются ещё и файлы “*.lib”. Используя ту же переменную систему сборки, укажем дополнительный путь к lib-файлам и имя lib-файла:
После этого шага программа должна собраться, но не сможет запустится (если только кто-то не положил “zlib1.dll” вам в папку System32). При попытке запуска — сообщение об отсутствии DLL.
Обеспечиваем запуск программы
Проще всего после сборки скопировать DLL в ту же папку, где лежит (точнее, будет лежать) EXE. Через настройки сборки проекта это делается очень легко путём запуска внешней команды copy:Если после этого шага ваша программа, использующая zlib, не запустилась — значит, вы что-то напутали в подключении или в своём коде.
Комментариев нет:
Отправить комментарий