Cmake tutorial

CMake - кроссплатформенная автоматизована система збирання проектів. Безпосередньо складанням вона не займається, а тільки генерує Makefile, який потім буде виконаний утилітою make.

CMake може перевіряти наявність необхідних бібліотек і підключати їх, збирати проекти під різними компіляторами і операційними системами. Тобто у вас є купа коду і файлик, що містить інформацію для cmake, і щоб скомпіліть це справа де-небудь ще, вам потрібно просто запустити там cmake, який зробить все сам. Зручно, корисно, просто.

[Ред] Якщо по Лайту

  • Створіть в IDE проект під cmake
  • Знайдіть в папці з проектом CMakeFiles.txt
  • Пробіжіться очима по туторіали, співвідносячи його з вашим CMakeFiles.txt

Про підключення бібліотек рекомендується все-таки прочитати цілком.

Передбачається, що знайти і завантажити сам cmake ти,% username%, в стані. //А якщо немає?

Припустимо, у Вас є ісходнічек "test.cpp" (// а якщо ні?). Для початку потрібно створити файлик для cmake, який зазвичай називають "CMakeLists.txt", і написати туди ось це:

Тепер запускаємо (з консолі) в цій папці команду "cmake CMakeLists.txt" (аргументом можна передавати не тільки файл, але і директорію, в якій він лежить, тоді cmake знайде його сам).

cmake буде використовувати переданий (або знайдений) файл проекту (той самий CMakeLists.txt), і в поточній директорії буде створювати проект. Проект - це багато-багато файлів і директорій (примітка: тому краще запускати cmake з іншої директорії, щоб можна було, наприклад, швидко видалити всі бінарники), з яких нас найбільше цікавить Makefile.

Makefile - це файл, потрібний для утиліти make. Саме вона запускає компілятори, лінковщік і інші радощі. Запускаємо make в каталозі збірки (тобто там же, де Ви запускали cmake). В консолі вилізе приблизно такий текст:

А у Вас в таткові з'явиться виконуваний файл "test". Запустіть, переконайтеся, що це дійсно те, що очікується від компіляцію файлу "test.cpp".

Порозбирали з різними можливостями cmake.

[Ред] Вказівка ​​необхідної версії cmake

Якщо використовувана версія cmake менше 2.6, він не захоче працювати. Писати цю команду завжди - хороший стиль (cmake буде пихкати і ображатися, якщо ви не вкажете версію, але збирати все одно все буде).

[Ред] Назва проекту

Вказує, що цей cmake-файл є кореневим для деякого проекту. З проектами пов'язані певні змінні і поведінку cmake (читайте документацію).

[Ред] Змінні

У cmake можна створювати текстові змінні. команда

запише в змінну "VARIABLE" значення "The variable's value". Щоб де-небудь використовувати значення цієї змінної, потрібно написати $.

Щоб додати до змінної якийсь текст, можна зробити так:

Як бачите, використовувати значення можна і всередині лапок. Змінні активно використовуються різними бібліотеками - для установки прапорів, параметрів збірки / лінковки і іншої смакоти, про це трохи пізніше.

Приклад коше'гного проекту зі списком сорци в окремій змінної:

[Ред] Встановлюємо команди компілятору

Ця команда використовується для установки дефайнов, яю можна перевірити в коді через, наприклад, #ifdef SOME_IMPORTANT_DEFINITION.

Ця команда додасть до прапорів, використовуваним при складанні c ++ - коду, прапори -std = c ++ 11 і -Wall.

Хто не знає: "-std = c ++ 11" включає в gcc підтримку стандарту c ++ 11, "-Wall" говорить gcc виводити всі попередження (дуже раджу, допомагає відловити багато дурних багів і писати акуратний код).

Якщо ваша версія GCC менше, ніж 4.7.0, замість -std = c ++ 11 потрібно використовувати -std = c ++ 0x.

В GCC 4.8.0 з'явився прапор -std = c ++ 1y, в якому починають реалізовувати фічі наступного стандарту.

[Ред] Папка з хедер

Припустимо, Ви хочете, щоб хедери (файліки, що підключаються через #include) шукалися ще і в каталогах "headers /" і "more_headers /":

Сподіваюся, і це зрозуміло.

[Ред] Найважливіше - підключення бібліотек

Навчимося шукати і підключати бібліотеки за допомогою cmake на прикладі Boost. Для початку встановимо змінні для буста:

Перше - ми не хочемо, щоб буст підключався до нас статично (тобто хочемо динамічну лінковку). Якщо ти,% username%, не знаєш, що це, поки просто забий і використовуй цей прапор так, як написано. Але найближчим часом дізнайся, про що мова. Другий прапор дозволяє бусту всередині своїх магічних реалізацій використовувати треди для розпаралелювання та інших радощів.

Отже, ми встановили прапори. Давайте знайдемо буст!

Припустимо, нам потрібні компоненти буста під назвою chrono (бібліотека для роботи з часом) і filesystem (бібліотека для роботи з файловою системою):

Win, будуть шукатися тільки потрібні бібліотеки, і їх розташування буде записано в змінну Boost_LIBRARIES.

Опція "REQUIRED" говорить про те, що бібліотека потрібна проекту. Без неї cmake вирішить, що відсутність даної бібліотеки - не так вже й страшно, і буде збирати далі.

Додамо директорії з хедер буста для пошуку в них хедерів:

Отже, залишилося знайдені бібліотеки підключити до виконуваного файлу.

Як бібліотек потрібно вказати шляхи до необхідних зібраним бібліотекам. cmake знайшов зазначені нами бібліотеки і записав в змінну, ніж ми і користуємося.

Зауважимо, що цю команду потрібно викликати після того, як створений target збірки (через add_executable).

[Ред] Приклад хорошого CMakeLists.txt і де він буде лежати

Отже, повний приклад використання всього цього. У нас є якась директорія (відтепер вважаємо її "/ sources"), і в ній лежать вихідні

У корені "/" лежить файл "/CMakeLists.txt":

Якщо Вам щось в ньому не зрозуміло - перечитайте відповідну інформацію вище.

Створюємо директорію "/ build" (не «/ sources / build"), переходимо в неї, запускаємо в ній "cmake.". ".." - мітка батьківської директорії. cmake візьме з неї наш CMakeLists.txt і по ньому створить проект в папці "/ build". Щоб проект зібрати, запускаємо "make" в тій же папці "/ build".

Таким чином, в корені у нас є:

  • CMakeLists.txt
  • директорія з кодами
  • каталог збірки

Всі розділене, автоматизовано і зручно.

[Ред] Як створити бібліотеку в піддиректорії і слінковать її з основною програмою

Нехай в ./ лежить основний проект, а в ./subdir ми хочемо зробити лібу, а в ./build побудувати проект.

Тепер можна в файлах основного проекту робити #include "lib.h"

У ./build запускаємо "cmake. make "і отримуємо зібраний проект.

Інтеграція з cmake у QtCreator не надто тісний, проте, працювати з ним можна.

Створюємо новий проект без використання Qt, вибираємо "Проект на С ++ з використанням CMake". Створиться дефолтний файл збірки, який просто додає все вихідні в директорії проекту і компілює їх в один бінарник.

[Ред] Як додати header в проект, щоб його було видно в списку файлів

Якщо ви створили файл header.h в директорію проекту, просто рядок "add_executable ($ $)" змініть на add_executable ($ $ "header.h")