воскресенье, 6 декабря 2015 г.

Подключение динамической библиотеки к C++ проекту в VS2013

Подключение динамической библиотеки — несложная операция, которая требует лишь настроек для шагов компиляции, компоновки и запуска программы. Чаще всего настройка одного шага делается одним действием.
Но, прежде чем настроить сборку с библиотекой, эту библиотеку надо найти и загрузить.

Найти и обезвредить

Нам нужна библиотечка, весь полезный код которой лежит в “*.dll”. Но откуда компилятор узнает список доступных в DLL функций и способы их вызова?
В самом файле часть информации имеется, но её недостаточно — как минимум, DLL не хранит информацию о типе возвращаемого функцией значения.
Всё это есть в заголовочных файлах, с которыми библиотека была собрана. А для полной сборки проекта в Visual Studio нам нужно скачать архив, содержащий:
  • Заголовочные файлы “*.h”
  • Файлы с информацией для компоновщика “.lib”
  • Файлы с заранее скомпилированной реализацией библиотеки “.dll”
Рассмотрим для примера zlib (http://www.zlib.net/). Страница этой библиотеки не очень понятна, но можно найти строку “zlib compiled 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 заранее собрана в машинный код и лежит в DLL. Но для компоновки под платформой Windows потребуются ещё и файлы “*.lib”. Используя ту же переменную систему сборки, укажем дополнительный путь к lib-файлам и имя lib-файла:

После этого шага программа должна собраться, но не сможет запустится (если только кто-то не положил “zlib1.dll” вам в папку System32). При попытке запуска — сообщение об отсутствии DLL.

Обеспечиваем запуск программы

Проще всего после сборки скопировать DLL в ту же папку, где лежит (точнее, будет лежать) EXE. Через настройки сборки проекта это делается очень легко путём запуска внешней команды copy:

Если после этого шага ваша программа, использующая zlib, не запустилась — значит, вы что-то напутали в подключении или в своём коде.

Комментариев нет:

Отправить комментарий