Тайные знания: библиотеки для С++
Многие начинающие программисты, уже освоив синтаксис C++, обнаруживают, что нет простого способа как подключить библиотеку, так и собрать программу для другой ОС, или чего хуже, под другим компьютером с той же ОС.
Это проблема отчасти порождается спорной практикой в обучении, когда код учат писать и запускать средствами IDE, таких как Visual Studio, Code::Blocks, и других. Поначалу такой подход работает, но лишь до первой реальной задачи сделать что-то, что запустится не только на вашем компьютере. Тут-то новички и сталкиваются с отсутствием стандартной системы сборки и менеджера зависимостей. После осознания этой сложности, большинство студентов, как правило, переходят на другие языки, попутно тиражируя в индустрии миф о том, что C++ де не кроссплатформенный язык, а вот мой Python/Java/C# — да. Между тем нас окружает множество замечательных кроссплатформенных программ написанных на C++. Если вы обучаетесь C++ и хотите понять как создавать такое ПО, то эта статья для вас.
1. Минутка теории. Получение исполняемого файла всегда и везде, зачем это необходимо?
Если вы читаете эту статью, то наверное, отдалено уже понимаете, что преобразует код компилятор (а склеивает в один исполнямый файл линковщик), но на практике, скорее всего до сих пор не сталкивались с этим, запуская сборку в один исполняемый файл сразу из IDE. Возможно вы вообще не пробовали собрать программу в файл, запуская её красивой зелененькой кнопочкой Run.
Однако и сама IDE, в свою очередь, не собирает и не запускает ваш код, а лишь вызывает специальную программу, которая называется система сборки, или сборщик, который-то и отвечает за сборку проекта и взаимодействие с компилятором и линковщиком.
У Visual Studio, к примеру, сборщиком по умолчанию является MSBuild, а у CLion — CMake. Те дополнительные файлы, которые вы видите, создав новый проект через интерфейс IDE, и являются конфигурацией для системы сборки. Наша задача просто научиться взаимодействовать с ней напрямую. Для этого мы возьмем CMake, потому что в отличие от MSBuild, эта система сборки запускается на большинстве ОС.
Почему надо разобраться в конфигурации системы сборки? Разве мне недостаточно среды, спросите вы? Потому что ваша среда может запуститься не везде, а система сборки гораздо более переносима, с ней вы сможете автоматизировать сборку, использовать контейнеры Docker, сможете оставить в репозитории билд скрипт который соберет ваш код на любом компьютере — ну разве не круто?
2. Пишем конфигурацию сборки самостоятельно
Итак, пришло время выйти из уютного мира в IDE, и вступить на путь уже кроссплатформенной стрельбы себе в ногу. Прежде всего, убедитесь что ваш код использует только стандартные функции С++. Если он вызывает ОС-зависимые API, вроде #include , то рассмотрите чем их можно заменить. После этого воспользуемся следующим шаблоном CMake и создадим новый файл CMakeLists.txt:
cmake_minimum_required(VERSION 3.18) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Подключаем менеджер зависимостей Conan list(APPEND CMAKE_MODULE_PATH $) list(APPEND CMAKE_PREFIX_PATH $) if (NOT EXISTS "$/conan.cmake") message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan") file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.16.1/conan.cmake" "$/conan.cmake" EXPECTED_HASH SHA256=396e16d0f5eabdc6a14afddbcfff62a54a7ee75c6da23f32f7a31bc85db23484 TLS_VERIFY ON) endif () include($/conan.cmake) # Подключаем репозиторий зависимостей https://conan.io conan_add_remote(NAME conan-center INDEX 1 URL https://center.conan.io VERIFY_SSL True) # Скачиваем нужные нам зависимости, например: conan_cmake_configure(REQUIRES catch2/2.13.6 spdlog/1.8.5 threadpool/20140926 simdjson/0.9.6 icu/69.1 GENERATORS cmake_find_package) conan_cmake_autodetect(settings) conan_cmake_install(PATH_OR_REFERENCE . BUILD missing REMOTE conan-center SETTINGS $) # Делаем зависимости видимыми для CMake find_package(Catch2) # фреймворк тестирования find_package(ICU) # работа с юникодом find_package(spdlog) # логирование find_package(simdjson) # парсинг json с помощью simd find_package(ThreadPool) # ThreadPoolExecutor # Подключаем файлы с основным кодом file(GLOB proj_sources src/*.cpp) add_executable(app $) # Линкуем зависимости для основного кода (имена для линковки можно вытащить из описания зависимостей) target_link_libraries(app PRIVATE ThreadPool::ThreadPool spdlog::spdlog simdjson::simdjson ICU::io ICU::i18n ICU::uc ICU::data) # Подключаем файлы с кодом тестов list(FILTER proj_sources EXCLUDE REGEX ".*/Main.cpp$") file(GLOB test_sources test/*.cpp) add_executable(test $ $) # Линкуем зависимости для тестов target_link_libraries(test PRIVATE Catch2::Catch2 ThreadPool::ThreadPool spdlog::spdlog simdjson::simdjson ICU::io ICU::i18n ICU::uc ICU::data)
В этом шаблоне задаётся практически все, что нужно вам для сборки:
- Устанавливается стандарт C++20
- Подключается репозиторий библиотек Conan
- Задается соглашение, что файлы с кодом (.cpp, .h) будут лежать в папке src.
- Задается соглашение, что файлы с кодом для тестов будут лежать в паке test.
- Задаётся соглашение, что точки входа (int main) будут лежать в файлах Main.cpp
Убедитесь что ваш код хранится по этим соглашениям.
В скрипте также сразу подключается для примера несколько библиотек, по аналогии, следуя комментариям, вы можете добавить нужные вам.
Искать их можно тут: conan.io.
3. Как теперь собрать наше приложение в файл?
Мы отказались от кнопочек IDE в пользу более могущественного скрипта. Теперь нам понадобится платформа GCC или LLVM (возможно они уже есть на вашем компьютере), установленная система сборки CMake и менеджер зависимостей Conan. Их легко установить при помощи пакетного менеджера вашей ОС, или вручную, с официальных сайтов.
Откройте терминал в папке, где лежит CMakeLists.txt. Сначала нужно подготовить make-файлы. Воспринимайте это как предварительное действие:
cmake -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -B bin
После этого можно собрать само приложение и тесты:
cmake --build bin --target all
Приложение будет расположено в директории bin в файле под именем app .
Тесты могут быть запущены при помощи отдельного файла test в той же директории.
Вот и всё! Не так уж сложно, правда? Теперь вы можете распространять свое ПО на разные ОС, легко собирать его и подключать библиотеки. Если вы попробовали и что-то не работает, или есть какие-то вопросы, то их можно задать в комментариях под этой статьёй, постараюсь ответить.
После того как вы разберетесь как это делать, можно пользоваться моим project-wizard’ом для создания кроссплатформенных C++ утилит и библиотек в один клик: github.com/demidko
Однако сперва рекомендую попробовать воспроизвести результат самостоятельно, для лучшего понимания, что именно вы делаете, ведь в процессе приходят осознание и навык.
- С++
- кроссплатформенность
- cmake
- как подключить библиотеку C++
- как пользоваться cmake
- cmake инструкция
- как пользоваться conan
- conan инструкция
- Программирование
- C++
- Терминология IT
- Системы сборки
- Учебный процесс в IT
Как установить библиотеку C++ в VS code?
Я скачал библиотеку вот тут: «», но не могу её установить в VS code, т.к работаю в нем не так много. Помогите пожалуйста!
- Вопрос задан более года назад
- 2755 просмотров
Комментировать
Решения вопроса 1
Владимир Коротенко @firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
вам интересен includePath
Ответ написан более года назад
Что такое SFML? Установка SFML в C++
Пссс, парень! Не хочешь попробовать немного SFML? Убойная штука. Достаточно самой малости и с её помощью ты сможешь воплотить в жизнь то, о чем раньше мог только мечтать. Тебе понравится, гарантирую. Тем более тебе, как новичку, первая порция бесплатно, я угощаю. Ну что, договорились? Тогда по рукам.
Оглавление:
- Что такое SFML?
- Установка библиотеки SFML в Visual Studio
- Первые шаги и первые…
- Заключение
Что такое SFML?
SFML (сокр. от «Simple and Fast Multimedia Library» = «Простая и быстрая мультимедийная библиотека») — это свободная кроссплатформенная мультимедийная библиотека, написанная на языке C++. Она также доступна и для других языков: C, C#, .Net, D, Java, Python, Ruby, OCaml, Go и Rust. Представляет собой объектно-ориентированный аналог SDL.
С её помощью можно легко и непринужденно создавать любую 2D-графику: начиная от простейших одиночных геометрических фигур (типа треугольника) и заканчивая полноценными играми-платформерами.
Исходный код библиотеки предоставляется под лицензией zlib/png, а скачать SFML можно с оф. сайта разработчика www.sfml-dev.org.
Примечание: Все примеры этого урока были сделаны мной в ОС Windows 7 с использованием IDE MS Visual Studio 2017 Community Edition и библиотеки SFML 2.5.1.
Ну что, парень, ты готов? Да вижу, что готов. Погнали!
Установка библиотеки SFML в Visual Studio
Я не буду рассказывать, как установить Visual Studio, а перейду сразу к SFML. Для того, чтобы установить библиотеку, нужно зайти на сайт www.sfml-dev.org и перейти в пункт меню «Download» и скачать «SFML 2.5.1»:

Как уже говорилось ранее, в качестве IDE я буду использовать Visual Studio 2017, поэтому скачиваем соответствующую версию SFML. Вы также можете заметить наличие готового пакета для эстетов Code Blocks. Помимо этого, в глаза бросаются варианты библиотеки для других версий Visual Studio. Сразу дам совет — не пытайтесь лепить Франкенштейна, используя неподходящий билд SFML, иначе вы рискуете получить вагон и маленькую тележку всякого рода проблем на свою голову.

Теперь скачанный архив нужно распаковать. У себя я выбрал следующий путь — C:\Soft\SFML-2.5.1-windows-vc15-32-bit .
Далее создадим пустой проект и подключим к нему библиотеку SFML. Для этого запустите Visual Studio и выберите «Файл» > «Создать» > «Проект…» , или можно воспользоваться сочетанием горячих клавиш Ctrl+Shift+N . Задайте имя и расположение проекта так, как показано на следующем скриншоте:

Теперь, когда у нас есть проект, нужно добавить в него файл, который будет содержать исходный код нашей программы. Для этого в окне «Обозреватель решений» клацните ПКМ по строке «Исходные файлы» > «Добавить» > «Создать элемент…» :

В поле «Имя» укажите main.cpp :

Отлично! Следующим шагом будет подключение библиотеки SFML к нашему проекту. Для этого нужно:
подключить каталог заголовочных и исходных файлов SFML ( /include );
подключить каталог библиотечных файлов SFML ( /lib );
подключить библиотечные файлы SFML в качестве дополнительных зависимостей.
Переходим в «Проект» > «Свойства: SFML_Tutorial…» :

В верхнем левом углу страницы свойств SFML_Tutorial есть выпадающий список возле пункта «Конфигурация» , установите его значение как «Все конфигурации» . Также проверьте, что в параметре «Платформа» установлено значение «Win32» . Затем в левой части окна найдите и выберите раздел «Свойства конфигурации» > «С/С++» > «Общие» . Обратите внимание на правую часть, нас интересует параметр «Дополнительные каталоги включаемых файлов» . Выберите его и нажмите . Перед вами появится новое окно, в котором нужно указать путь к заголовочным файлам библиотеки SFML. Обычно они располагаются в папке include. У меня этот путь выглядит как C:\Soft\SFML-2.5.1-windows-vc15-32-bit\SFML-2.5.1\include .

Похожим образом подключаются и файлы библиотек. Всё, что нужно сделать — это выбрать в левой части «Свойства конфигурации» > «Компоновщик» > «Общие» . Затем «Дополнительные каталоги библиотек» и . В открывшемся окне нужно будет указать путь к библиотечным файлам SFML, у меня это C:\Soft\SFML-2.5.1-windows-vc15-32-bit\SFML-2.5.1\lib .

Осталось подключить несколько файлов в виде дополнительных зависимостей для «Компоновщика». Для этого нужно переключить тип конфигурации на Debug , а затем в левой части окна выбрать «Свойства конфигурации» > «Компоновщик» > «Ввод» . Переведите взгляд на правую часть, где нужно найти строку «Дополнительные зависимости» и нажмите . В появившемся окне впишите имена следующих 4 файлов:
sfml-graphics-d.lib
sfml-window-d.lib
sfml-audio-d.lib
sfml-system-d.lib
Должно получиться следующее:

Первые шаги и первые…
На этом этапе подключение библиотеки SFML к проекту завершено, и мы можем перейти к непосредственному написанию кода для нашей первой программы. Ниже представлен минимальный каркас приложения:
using namespace sf ;
// Объект, который, собственно, является главным окном приложения
RenderWindow window ( VideoMode ( 200 , 200 ) , «SFML Works!» ) ;
// Главный цикл приложения. Выполняется, пока открыто окно
while ( window . isOpen ( ) )
// Обрабатываем очередь событий в цикле
Event event ;
while ( window . pollEvent ( event ) )
// Пользователь нажал на «крестик» и хочет закрыть окно?
if ( event . type == Event :: Closed )
// тогда закрываем его
window . close ( ) ;
// Отрисовка окна
window . display ( ) ;
Я вижу, как ваша рука уже потянулась к кнопке «Скомпилировать и запустить проект», но не торопитесь, давайте сначала разберем данный код:
Строка №1: Директива препроцессора #include… , которая подключает исходный файл SFML/Graphics.hpp к нашему проекту. Как раз этот файл и предоставляет нам возможность работать с 2D-графикой: спрайтами, текстом, геометрическими фигурами и прочими объектами.
Строка №3: Подключаем пространство имен sf .
Строка №8: Создаем объект window класса RenderWindow. Данный объект — это наше окно, в котором будет отображаться 2D-графика. Первый параметр VideoMode(200, 200) задает видеоразрешение окна (ширину и высоту). Второй параметр «SFML Works!» — это заголовок окна.
Далее идут 2 цикла while: внешний (строка №11) и внутренний (строка №15). Сложного здесь ничего нет. SFML предлагает удобные средства для работы с событиями. Именно их мы и будем использовать для создания цикла работы приложения и обработки событий окна. Во внешнем цикле while при помощи метода isOpen() мы проверяем, открыто ли наше окно в данный момент. Во внутреннем цикле while метод pollEvent(event) перебирает очередь событий (сообщений), которые возникают в нашем окне.
Очередь может содержать любое количество сообщений, именно по этой причине мы и используем цикл, чтобы перебрать их все. Предположим, например, что пользователь перемещает курсор во время выполнения нашей программы или нажимает на какие-то объекты. SFML обнаружит это и поместит два события в очередь: одно на перемещение курсора и одно на нажатие на объект. Выбрать определенное сообщение из очереди можно с помощью метода pollEvent() класса RenderWindow. Так вот, если какое-то событие из этой очереди совпадает с Event::Closed (т.е. пользователь нажал на крестик, тем самым послав сигнал «Закрыть окно»), то при помощи windows.close() мы закрываем окно. По сути, этот цикл бесконечен, и выход из него только один — закрыть окно программы.
В строке №23 мы вызываем метод display(), который отвечает за отрисовку нашего окна.
Вот теперь можно перейти к компиляции и первому запуску программы. Для этого нажмите в Visual Studio «Отладка» > «Запуск без отладки» (или Ctrl+F5 ). Ииии, вот и она! Ваша первая… ЧТО…. ОШИБКА…. WTF….
«Что за хрень. » — спросите вы. Столько времени потрачено на ковыряние, настройку и прочее ради вот этого вот?! Долбанного окна с ошибкой?! Нафиг всё, дизлайк/отписка, го даст2 я создал.

А проблема в том, что исполняемый файл нашей программы не может найти *.dll-файлы, в которых хранятся используемые нашим приложением функции. Решение очень простое — нужно скопировать все файлы (11 штук) из папки C:\Soft\SFML-2.5.1-windows-vc15-32-bit\SFML-2.5.1\bin\ в папку C:\dev\SFML_Tutorial\Debug\ , в которой хранится наш исполняемый файл SFML_Tutorial.exe:

Попробуйте теперь скомпилировать и запустить проект. В результате должно получиться следующее:

Это ваша первая программа, написанная на языке C++ с использованием библиотеки SFML. Черное окно Малевича. Как по мне, это выглядит как-то убого. Предлагаю добавить красок и поменять цвет фона с черного на какой-нибудь более веселый цвет. Для этого нам пригодится метод windows.clear() . Ниже представлен участок кода, куда нужно добавить данный метод:
Как подключить стороннюю библиотеку Python к Visual Studio?
Сразу оговорюсь,не важно почему и зачем я хочу использовать для питона студию.Пишу для одной графической программы пару инструментов,у нее есть свой пайтон движок.В папке программы той,есть все,и библиотеки,и интерпритатор.Как сделать так,чтобы в студии работало автодоплнение из тех библиотек?Сумбурно немножко,но суть надеюсь уловили.Если что,простите.
- Вопрос задан более трёх лет назад
- 13652 просмотра
