Подключение внешних библиотек
Рассмотрим пример подключения внешней библиотеки OpenCV и сборку программы в терминале, а также в IDE Visual Studio и CLion, используя разные системы сборки.
Все дальнейшие примеры проводились для компилятора clang
под Windows. При использовании дргих компиляторов ключи будут другими. Под Unix-системами пути до бибилотеки после её установки и расширения файлов библиотек будут другими.
OpenCV
Популярная библиотека для работы с изображениями. Будем рассматривать пример подключения библиотеки в программу, написанную на C. Для этого используется OpenCV версии 3.4 (sources), т.к. начиная с версии 4.0 C API было удалено из исходников библиотеки.
Структура баблиотеки выглядит следующим образом:
Общая структура библиотеки может поставляться в виде исходники (sources) + собранная версия библиотеки (build). OpenCV как раз можно скачать в таком варианте.
Нас интересует собранная версия, поэтому рассмотрим подробнее струкутуру директории build:
Чаще всего в библиотеках/фреймворках встречаются директории include
, bin
, lib
, x86
, x64
, docs
, 3rdparty
, samples
и прочие.
Рассмотрим структуру поддиректорий include
, bin
, x64
Как можно заметить, заголовочные файлы не обязаны все лежать в одной директории, а могут быть расположенны по разным поддиректориям. Также в OpenCV версии 3 видно, что рядом могут лежать заголовочные с C и C++ API.
В OpenCV исполняемые файлы и файлы динамических библиотек самой OpenCV располагаются не в корневой bin
директории. Такое также встречается, когда bin
директорий в проекте несколько и в таком случае необходимые файлы динамический библиотек следует искать в директориях x86
и x64
. Последняя в сброке OpenCV имеется.
vc14
и vc15
– директории, содержащие сборки под разными версиями Visual Studio. vc15
– сборка под VS 2017 и позднее, vc14
– VS 2015. Структура в директориях идентичная, так что будем рассматривать vc15
.
Можно заметить, что и dll
, и lib
файлы представлены в двух вариациях, отличающихся суффиксом d
. В OpenCV файлы библиотек с суффиксом d
собраны с сохранением отладочной информации и их следует использовать при сборке программы в debug-конфигурации. Без суффикса – релизная сборка.
В качестве тестовой программы будем использовать код main.c
, который позволяет открыть изображение, поданной через аргументы командной строки, в отдельном окне.
Подключение внешних библиотек в терминале
Попробуем собрать программу без указания особых ключей компиляции:
При запуске программы получим:
Попробуем указать сборку в другую битность (по умолчанию x64):
Действительно, программа собрана как 32-битная. Т.к. в нашем распоряжении имеются собранные файлы библиотек только в варианте x64
, то в дальнейшем будем собирать программу 64-битную.
Как можно заметить, в коде нигде явно не объявлен макрос OPENCV
и соотственно код, связанный с использованием библиотеки был отброшен на этапе препроцессинга.
Объявим макрос OPENCV
на этапе сборки программы:
Ошибка гласит, что не удалось найти заголовочный файл. Мы не указали include directories, из-за чего на этапе препроцессинга поиск заголовочных файлов проводился только в директориях, заданных по умолчанию (директории компилятора и системные директории).
Исправим это. Примечание: в текущем примере директория opencv
лежит относительно main.c
по ..\library\opencv
.
Теперь можно заметить, что компиляция прошла успешно, а вот на этапе линковки возникли проблемы unresolved external symbol
. Линковщику необходимо указать пути до файлов и сами файлы статических библиотек:
Обратите внимание, если указать имя файла с расширением, то собрать программу не получится.
Ура, никаких ошибок линковки не возникло. Попробуем запустить программу:
Теперь ошибка на старте программы. В таких случаях можно запустить программу через явное создание процесса или же из проводника:
В обоих случаях удаётся найти сообщение об ошибке – не найден файл динамической библиотеки.
В таком случае есть 2 варианта:
Скопировать
.dll
-файл рядом сexe
-файлом.Добавить директорию, в которой лежит необходимый
.dll
-файл в переменные окружения. В таком случае не нужно каждый раз копироватьdll
кexe
-файлу.
В этом примере подложим dll
файл к exe
:
При запуске видно, что всё открылось успешно и в консоли также видно данные, выводимые в программе.
Подключение внешних библиотек в системе сборки MSBuild (Visual Studio)
Система сборки MSBuild имеет консольный и пользовательский графический интерфейс. Рассмотрим настройку через графический интерфейс в среде разработки Visual Studio.
Добавим готовый файл main.c
из начального примера в проект.
Все параметры и данные для сборки настраиваются через свойства решений и проектов в IDE Vusial Studio. Если в решении несколько проектов, то системе сборки MSBuild можно задать правила и порядок сборки проектов, что может быть полезно, если имеется зависимость между проектами в решении.
В нашем случае будет 1 проект в 1 решении и далее мы будем рассматривать только настройки проекта (ПКМ по проекту – Properties).
В первую очередь настоятельно рекомендуется установить общие для всех конфигураций и платформ настройки, установив Configurations и Platforms в All. Затем уже устанавливать параметры, различные для конфигураций и платформ. Это сильно сэкономит времени и нервов :)
В первой вкладке General
можно настроить используемый toolset
, название выходного файла, стандарт языка и пр.
Toolset – набор инструментов платформы, состоящий из компилятора C++ (cl.exe) и компоновщика (link.exe), а также стандартных библиотек C/C++.
По умолчанию будет доступен 1 toolset
той VS, которая была установлена (например 2022). Через Visual Studio Installer можно поставить toolset
более ранних VS, а также поставить clang
(LLVM-Clang на скрине). Помимо этого компилятор Intel имеет интеграцию в VS и после установки также будет доступен в выпадающем списке.
Target name – имя выходного файла. Аналог -o
у clang-а.
Стандарт языка позволяет явно задать под какой стандарт будет собираться программа. аналог -std=
у clang-а.
Во вкладке Отладка можно настроить рабочую директорию и аргументы командной строки.
Рабочая директория – директория, относительно которой будет вестить поиск файлов. По умолчанию - каталог, содержащий файл проекта. Когда программа собирается из терминала, то рабочая директория – та, в которой вы находитесь в терминале.
На скриншотах выше вы могли заметить значения вида $(ProjectDir)
и пр. Это макросы VS, которые будут раскрываться при сборке программы. Во что раскрываются макросы можно посмотреть при редактированнии полей:
Попробуем собрать и запустить нашу программу в Release x64
и Debug x86
.
Переключение между конфигурациями происходит достаточно просто через опции на верхней панели среды разработки.
Однако как в случае со сборкой в терминале мы видим, что код OpenCV не был задействован, т.к. мы не указали полезных данных для среды разработки про OpenCV.
В первую очередь посмотрим на подсказки самой среды разработки:
Видно, что фрагмент кода в main()
показывается тусклым. Так среда разработки подсказывает, что этот код не будет исполняться – либо код недостижим, либо будет отброшен на этапе препроцессинга. Второй вариант как раз характеризует наш случай.
Если укажем preprocessor defines
, то картина изменится:
Теперь IDE явно подсказывает, что код будет исполняться, но про сами макросы и функции из OpenCV ничего не известно.
Укажем include directories:
В разделе C/C++/general
помимо include directories можно изменить ключ компиляции warning levels для отлавливания большего числа предупреждений и нужно отключить SDL checks для наступления счастья.
Теперь при попытке сборки ожидаемо будут возникать ошибки линковки:
Которые исправим указанием файлов статических бибилотек и директорий, где они расположены. Обратите внимание, что здесь мы явно указываем платформу x64
, т.к. собрана библиотека у нас только в этом варианте; а при задании файла мы не забудем для сборки в debug указать debug-версию библиотеки, а для release – release-файл.
Теперь сборка будет проходить успешно:
А для корректного старта необходимо в корень проекта или к exe-файлам подложить dll
файлы (подсказка: в корень проекта проще).
Подключение внешних библиотек в системе сборки CMake (Visual Studio)
Visual Studio 2022 поддерживает CMake и позволяет писать CMake-проекты.
Также помимо запуска под Windows есть возможность настроить запуск под WSL (есл установлен) или же настроить запуск с удаленного хоста.
По умолчанию создано несколько стандартных конфигураций сборки программы:
По умолчанию все проекты CMake в VS создаются как C++-проекты и при необходимости необходимо самостоятельно изменить в свойствах проекта язык с C++ (CXX) на C.
Свойства проекта представлены в виде CMakeLists.txt
файла:
Укажем явно, что мы хотим собирать проект под C17 и, например, что поддержка этого стандарта нам необходима для сборки (более ранние версии не подойдут):
Дополним его необходимыми сведениями про OpenCV.
Заведём для примера переменную, содержащую все файлы проекта, которые будут подаваться на компиляцию
Укажем макрос
Дополним ключи компиляции по умолчанию ключом про уровень предупреждений (по умолчанию
/W3
)
Укажем include directories
Укажем при сборке в
x64
library directories
Модифицируем аргументы конструкции
add_executable
Дополним сведения о файлах статических библиотек
CMAKE_BUILD_TYPE
нам известен из файла CMakePresets.json
, в котором указаны компилтор и подсистема сборки (по умолчанию Ninja), а также переменные каждой конфигурации, которые можно смело использовать в CMakeLists.txt
.
Примечение: при изменении CMakeLists.txt
они автоматически сохраняются и сразу происходит регенерация кеша сборки:
Там содержаться логи регенерации с ошибками (если они есть). В противном случае будет CMake generation finished.
. Из полезного: Command line:
, в которой можно посмотреть параметры, с которым вас по итогу собирают, и Working directory:
– рабочая директория проекта (та, где лежит сформированный выходной файл).
Чтобы задать аргументы командной строки необходимо:
Переключить отображение в
Solution Explorer
наProject View
Перейти в
Add Debug Configurations
(ПКМ по проекту)
Прописать параметр
args
в открывшемсяlaunch.json
:
После проделанных манипуляций при указании на верхней панели конфигураций x64 Release
и x64 Debug
будет собираться программа, запускаться с переданным аргументом и показываться картинка на экране, а приx86 Release
и x86 Debug
– ошибка линковки.
Подключение внешних библиотек в системе сборки CMake (CLion)
Сам файл CMakeLists.txt
почти ничем не будет отличаться, за исключением:
cmake_minimum_required (VERSION 3.8)
вероятно будет боьшей версии# Enable Hot Reload for MSVC compilers if supported.
и связанный с этим комментариемif
будет отсутствовать.флаги компиляции следует указывать те, которые нужны для используемого
toolchain
– еслиtoolchain
не VS, то/W4
можно заменить на-Wall -Wextra -Wpedantic
Подробнее про toolchain
в CLion: clang-clion
Last updated