CMake Tutorial
Содержание
Что это и зачем нужно [ править ]
CMake — кроссплатформенная автоматизированная система сборки проектов. Непосредственно сборкой она не занимается, а только генерирует Makefile, который потом будет выполнен утилитой make.
CMake может проверять наличие необходимых библиотек и подключать их, собирать проекты под разными компиляторами и операционными системами. Т.е. у вас есть куча кода и файлик, содержащий информацию для cmake, и чтобы скомпилить это дело где-нибудь еще, вам нужно просто запустить там cmake, который сделает всё сам. Удобно, полезно, просто.
Краткое описание [ править ]
Если нет желания/времени/сил читать весь туториал и Вы используете какой-нибудь QtCreator (или любая другая IDE, умеющая работать с cmake), то:
Про подключение библиотек рекомендуется все-таки прочитать целиком.
Старт [ править ]
Предполагается, что найти и скачать сам cmake ты, %username%, в состоянии. //а если нет?
Предположим, у Вас есть исходничек «test.cpp» (// а если нет?)(А если нет, то CMake тебе трогать рано). Для начала нужно создать файлик для cmake, который обычно называют «CMakeLists.txt», и написать туда вот это:
Теперь запускаем (из консоли) в этой папке команду «cmake CMakeLists.txt» (аргументом можно передавать не только файл, но и директорию, в которой он лежит, тогда cmake найдет его сам).
А у Вас в папочке появится исполняемый файл «test». Запустите, убедитесь, что это действительно то, что ожидается от компиляции файла «test.cpp».
Подробное описание [ править ]
Поразбираемся с различными возможностями cmake.
Указание необходимой версии cmake [ править ]
Название проекта [ править ]
Указывает, что этот cmake-файл является корневым для некоторого проекта. С проектами связаны определенные переменные и поведение cmake (читайте документацию).
Переменные [ править ]
В cmake можно создавать текстовые переменные. Команда
Чтобы добавить к переменной некий текст, можно сделать так:
Пример коше’гного проекта со списком сорцов в отдельной переменной:
Устанавливаем команды компилятору [ править ]
Эта команда используется для установки дефайнов, которыe можно проверить в коде через, например, #ifdef SOME_IMPORTANT_DEFINITION.
Кто не знает: «-std=c++11» включает в gcc поддержку стандарта c++11, «-Wall» говорит gcc выводить все предупреждения (очень советую, помогает отловить много глупых багов и писать аккуратный код).
Папка с хедерами [ править ]
Допустим, Вы хотите, чтобы хедеры (файлики, подключаемые через #include) искались еще и в каталогах «headers/» и «more_headers/»:
Надеюсь, и это понятно.
Научимся искать и подключать библиотеки при помощи cmake на примере Boost. Для начала установим переменные для буста:
Итак, мы установили флаги. Давайте найдем буст!
Допустим, нам нужны компоненты буста под названием chrono (библиотека для работы со временем) и filesystem (библиотека для работы с файловой системой):
Win, будут искаться только нужные библиотеки, и их расположение будет записано в переменную Boost_LIBRARIES.
Добавим директории с хедерами буста для поиска в них хедеров:
Итак, осталось найденные библиотеки подключить к исполняемому файлу.
В качестве библиотек нужно указать пути к необходимым собранным библиотекам. cmake нашел указанные нами библиотеки и записал в переменную, чем мы и пользуемся.
Заметим, что эту команду нужно вызывать после того, как создан target сборки (через add_executable).
Пример хорошего CMakeLists.txt и где он будет лежать [ править ]
Итак, полный пример использования всего этого. У нас есть некая директория (отныне считаем ее «/sources»), и в ней лежат исходники
В корне «/» лежит файл «/CMakeLists.txt»:
Таким образом, в корне у нас есть:
Все разделено, автоматизировано и удобно.
Как создать библиотеку в поддиректории и слинковать ее с основной программой [ править ]
Теперь можно в файлах основного проекта делать #include «lib.h» (см. документацию по target_include_directories).
Как использовать CMake в связке с QtCreator [ править ]
Интеграция с cmake у QtCreator не очень тесная, тем не менее, работать с ним можно.
Создаем новый проект без использования Qt, выбираем «Проект на С++ с использованием CMake». Создастся дефолтный файл сборки, который просто добавляет все исходники в директории проекта и компилирует их в один бинарник.
Как добавить header в проект, чтобы его было видно в списке файлов [ править ]
Если вы создали файл header.h в директорию проекта, просто строчку
Cmakelists txt что это
На первом шаге проект нужно сконфигурировать, то есть создать финальный скрипт сборки, запустив cmake в будущем каталоге сборки.
Структура CMakeLists.txt
В начале главного файла CMakeLists.txt ставят метаинформацию о минимальной версии CMake и названии проекта:
Затем следует список инструкций, служащих для вычисления различных переменных, создания целей сборки, подключения проектов из подкаталогов и так далее. Например, подключить дополнительный CMakeLists.txt из подкаталога можно так:
Целью может стать исполняемый файл, собираемый из исходного кода
Целью также может быть библиотека, статическая или динамическая.
Автогенерация проекта для Visual Studio (Windows)
Если используется Visual C++, то путь немного другой: на шаге конфигурирования создаётся проект для Visual Studio, который затем можно собрать из IDE либо так же из командной строки.
Созданный проект Visual Studio нельзя изменять и использовать постоянно, потому что при генерации проекта используются абсолютные пути и другие неприемлемые для постоянной работы вещи.
Зависимости между библиотеками и приложениями
Вы можете выбирать область видимости настройки:
Пример использования областей видимости:
Схема зависимостей условного проекта:
Выбор стандарта и диалекта C++
Для настройки стандарта и флагов языка C++ не добавляйте флаги напрямую!
В CMake версии 3.8+ вы можете прямо потребовать включить нужный стандарт:
В CMake версии до 3.7 включительно можно использовать set_target_properties (если не работает, то у вас слишком старый CMake):
Для разработчиков библиотек есть более тонкий контроль над возможностями языка:
Функции в CMake
Добавление исходников к цели с target_sources
Лучше добавлять специфичные исходники с помощью target_sources, а не с помощью дополнительных переменных.
Интерфейс к утилитам командной строки
Функция find_package
Функция find_package принимает имя библиотеки как аргумент и обращается к CMake, чтобы найти скрипт для настройки переменных данной библиотеки. В итоге при сборке либо возникает ошибка из-за того что пакет не найден, либо добавляются переменные, хранящие пути поиска заголовков, имена библиотек для компоновщика и другие параметры.
Пример подключения Boost, вызывающего встроенный в CMake скрипт FindBoost:
Пример подключения библиотеки Bullet с помощью встроенного скрипта FindBullet и компоновки с приложением my_app:
Знакомство с CMake. Часть 1. Установка, CMakeLists.txt, сборка.
Введение.
Многие, кто начинал создавать собственные программы, пользовался какой-либо системой сборки. В общем, система сборки – это набор инструментов, облегчающий работу с компилятором. Это включает в себя компиляцию, линковку, установку, а также сбор исходных файлов для передачи их компилятору и слежение за зависимостями. Также современные системы сборки облегчают работу с библиотеками, позволяют создавать переносимые проекты и выполняют ещё массу других вкусностей. Эта статья посвящена популярной системе сборки CMake и расскажет, как правильно её установить и настроить, а также будет рассмотрен простой пример её использования. Она рассчитана на тех, что хоть немного знаком с понятиями make, Makefile, компиляция, линковка.
Установка в Linux.
Для популярных дистрибутивов Linux типа Debian, Gentoo, Fedora и т.д. CMake давно лежит в официальных репозиториях. Нам нужно всего лишь установить пакет cmake с помощью менеджера пакетов. Как правило, он устанавливается в системные директории, и необходимости править переменные окружения нету. Можете проверить её работоспособность, выполнив
Если же в репозитории нет такого пакета, то можно его собрать вручную. Скачиваем Unix/Linux Source, например, cmake-3.5.0-rc3.tar.gz, распаковываем и собираем:
Установка в Windows.
Для Windows на сайте CMake лежит установочный файл msi. Рекомендую при установке отметить галочку добавления пути в переменные окружения PATH для всех пользователей. Тогда, после перелогинивания, CMake будет доступен из любого места. Проверить можно, открыв cmd и выполнив тот же
Дневник программиста
вторник, 10 апреля 2012 г.
Пример заготовки CMakeList.txt для простого проекта
Введение в CMake
Утилита cmake является кроссплатформенной утилитой с открытым исходным кодом (open source), используемой для создания традиционных сценариев сборки проектов для следующих платформ.
Процесс сборки проекта, при использовании cmake, состоит из следующих этапов.
Используя специальные генераторы можно привязать систему CMake к определенным системам сборки, таким как Qt, Borland C++ Builder, MS Visual C++ и пр. Это свойство системы, само по себе интересно, но привязка кроссплатформенной сборки к какому-то конкретному продукту, выглядит, в общем случае, неразумно. Не считая, разумеется, вариант с поддержкой Qt SDK. Здесь особый разговор, так как сборка остается кроссплатформенной, но составляет альтернативу собственной системе сборки для Qt, qmake, которая не лишена некоторых недостатков.
Я вспоминаю о CMake всегда, когда не делаю проект в Qt. Вот почему.
Из написанного выше не следует, что CMake удобен только для небольших проектов. Просто большие проекты это дело особого обсуждения. Часто тут решение принимает не один человек и, в некоторых случаях, это решение определяется самой постановкой задачи. Зачем, например, городить огород, если задача заказана в MS Visual Studio и будет использована только там. В случае, если CMake допустим для проекта, то это позволит получить удобства описанные в списке выше.
CMakeLists.txt для простого проекта
Итак, мы начали простой проект. Создали каталог my-project и создали в нем подкаталог src для размещения источников кода нашего проекта. Напишем заготовку в файл src/main.cpp и теперь настроим CMake для сборки по этому проекту. Потом мы будем добавлять в сборку новые файлы и, возможно, библиотеки. Отразим все эти возможности в нашей заготовке.
Конфигурационный файл для системы CMake должен называться CMakeLists.txt. Расположим его в каталоге my-project и получим следующую систему файлов.
Представим шаблон файла CMakeLists.txt для простого проекта.
Рассмотрим значение представленных в файле команд.
_SOURCE_DIR в значение имени каталога проекта.
list с первым аргументом APPEND выполняет добавление к списку, указанному вторым аргументом, элемента заданного третьим аргументом. В нашем случае, к списку под именем SRC добавлено имя файла main.cpp с путем, указанным значением переменной SRC_DIR.
Русские Блоги
CMakeLists.txt из Cmake
Мы знаем, что makefile является файлом сценария при компиляции кода c или c ++ в Linux, но каждая функция должна записывать файл makefile, так что если этот проект большой и корреляция относительно сильная, запись в make-файле изменится Это относительно громоздко, и еще более ужасно то, что если вам нужно добавлять новые функции или новым людям нужно модифицировать функцию в будущем, это кажется особенно хлопотным, из-за этого, cmake, кажется, решает такие проблемы. Начать работу с cmake довольно легко. А управление особенно удобно и просто, так что давайте начнем.
Все операторы cmake записываются в файл CMakeLists.txt. После того, как файл CMakeLists.txt определен, используйте команду cmake для его непосредственного запуска, но эта команда должна указывать на каталог, где находится CMakeLists.txt. После того, как cmake выдаст то, что нам нужно Makefile, а затем сделать непосредственно для компиляции результатов, которые нам нужны. Более простое объяснение состоит в том, что cmake существует для генерации make-файлов, поэтому нам больше не нужно писать make-файлы, нам просто нужно написать простой CMakeLists.txt.
Процесс выполнения cmake очень прост. Мы сосредоточены на том, как написать файл CMakeLists.txt. Мы изучим синтаксис cmake на примерах.
1. Простой пример одного файла
Содержимое файла CMakeLists.txt выглядит следующим образом:
Проект первой строки не является обязательным, лучше всего добавить, это представит две переменные:
Он также определяет две эквивалентные переменные:
Внешняя компиляция всегда должна различать каталоги, соответствующие этим двум переменным
Может быть выведено сообщением
команда set используется для установки переменных
add_exectuable сообщает проекту о создании исполняемого файла.
add_library говорит, чтобы создать файл библиотеки.
В файле CMakeList.txt имена команд не чувствительны к регистру, а параметры и переменные чувствительны к регистру.
Наконец, выполните make в этом каталоге, чтобы сгенерировать соответствующую исполняемую программу.
2. Работа с несколькими исходными файлами
Содержимое заголовочного файла hello.h выглядит следующим образом
содержимое файла hello.c
Содержимое файла main.c выглядит следующим образом
Тогда файл CMakeLists.txt
Затем сохраните cmake и сделайте, используя вышеуказанный метод, вы можете сгенерировать необходимый исполняемый файл
3. Создайте библиотеку из hello.c для вызова
Если вы генерируете hello как библиотеку для вызова, вам нужно только изменить файл CMakeLists.txt на основе 2, а затем скомпилировать его.
Модифицированный CMakeLists.txt выглядит следующим образом:
Напротив, мы просто добавили новую целевую библиотеку hello и связали ее с нашей демонстрационной программой.
Затем используйте тот же метод, чтобы скомпилировать cmake и сделать
4. Скомпилируйте папку классификации проекта
Во-первых, мы успешно использовали библиотеку, но исходный код находится по тому же пути, поэтому, если объем кода относительно велик, он может быть классифицирован и образовывать несколько папок, поэтому нам нужно открыть код, На данный момент нам нужны три файла CMakeLists.txt, структура каталогов выглядит следующим образом
Мы помещаем программу main.c в каталог приложения, hello.c hello.h в папку libso, а затем в эту папку добавляется файл CMakeLists.txt, а в папки app и libso также находятся файлы CMakeLists.txt. Существует три файла CMakeLists.txt, поэтому давайте отредактируем эти три файла.
Затем есть CMakeLists.txt папки libso, где SHARED указывает на сгенерированную динамическую библиотеку, а если SHARED удален, генерируется статическая библиотека.
Наконец, внешний файл CMakeLists.txt находится в том же каталоге, что и приложение.
Наконец, мы выполняем указанную выше команду в каталоге сборки, чтобы скомпилировать исполняемый файл, который нам нужен.
5. Установка Cmake проста в использовании
Я понимаю, что установка в cmake на самом деле является скомпилированным исполняемым файлом или сгенерированным библиотечным файлом и помещает его в соответствующее расположение системы.Например, исполняемый файл должен быть размещен непосредственно в каталоге bin, а файл библиотеки должен быть размещен. В соответствующем каталоге lib я изменяю файл CMakeLists.txt на основе приведенного выше примера. После редактирования выполняются следующие шаги компиляции, что является дополнительным этапом установки, так что мы можем использовать исполняемый файл в Linux, выполнить файл Будем так называть библиотеку.
CMakeLists.txt модификации каталога приложения выглядит следующим образом: просто добавьте последнюю строку установки на основе предыдущей
Модифицированный CMakeLists.txt из каталога libso выглядит следующим образом: просто добавьте последнюю строку установки на основе предыдущего
Таким образом, путь к установке исполняемого файла:
Путь установки файла библиотеки so:
Соответствующие ссылки на исходный код приведены ниже:




