Изменения

Перейти к: навигация, поиск

CMake Tutorial

6702 байта добавлено, 01:35, 23 июня 2019
Указание необходимой версии cmake
{{В разработке}}
 
// Тут скоро будет туториал по CMake.
= Что это и зачем нужно =
CMake может проверять наличие необходимых библиотек и подключать их, собирать проекты под разными компиляторами и операционными системами. Т.е. у вас есть куча кода и файлик, содержащий информацию для cmake, и чтобы скомпилить
это дело где-нибудь еще, вам нужно просто запустить там cmake, который сделает всё сам. Удобно, полезно, просто. <span style="color== Краткое описание ===Если нет желания/времени/сил читать весь туториал и Вы используете какой-нибудь QtCreator (или любая другая IDE, умеющая работать с cmake), то:#a0a0a0">Дисклеймер: Никита все еще считает, что  * Создайте в IDE проект под cmake не нужен* Найдите в папке с проектом CMakeFiles.txt* Пробегитесь глазами по туториалу, но Никита извращенец и просто дураксоотнося его с вашим CMakeFiles.txt Про подключение библиотек рекомендуется все-таки прочитать целиком.</span>
= Старт =
Предполагается, что найти и скачать сам cmake ты, %username%, в состоянии. //а если нет?
Предположим, у Вас есть исходничек "test.cpp"(// а если нет?)(А если нет, то CMake тебе трогать рано).
Для начала нужно создать файлик для cmake, который обычно называют "CMakeLists.txt", и написать туда вот это:
cmake будет использовать переданный (или найденный) файл проекта (тот самый CMakeLists.txt), и в '''текущей''' директории будет создавать проект.
Проект - это много-много файлов и директорий(примечание: поэтому лучше запускать cmake из другой директории, чтобы можно было, например, быстро удалить все бинарники), из которых нас больше всего интересует Makefile.
Makefile - это файл, нужный для утилиты make.
А у Вас в папочке появится исполняемый файл "test". Запустите, убедитесь, что это действительно то, что ожидается от компилляции файла "test.cpp".
= We need to go deeper Подробное описание =
Поразбираемся с различными возможностями cmake.
cmake_minimum_required(VERSION 2.6)
Указывайте высокую минимальную версию CMake.Если используемая версия cmake меньше 2.6, он не захочет работать. Писать эту команду всегда - хороший стиль(cmake будет пыхтеть и обижаться, если вы не укажете версию, но собирать всё равно всё будет).
=== Название проекта ===
project(visualization)
Тут все понятноУказывает, что этот cmake-файл является корневым для некоторого проекта. Тоже хороший стильС проектами связаны определенные переменные и поведение cmake (читайте документацию).
=== Переменные ===
=== Устанавливаем команды компилятору ===
add_definitions(-std=c++11 -WallDSOME_IMPORTANT_DEFINITION)
Компилятору при компиляции добавляются соответствующие опции.Кто не знает: "-std=c++11" включает Эта команда используется для установки дефайнов, которыe можно проверить в gcc поддержку стандарта c++11коде через, "-Wall" говорит gcc выводить все предупреждениянапример, #ifdef SOME_IMPORTANT_DEFINITION.Сказать флаги для с++ можно и через переменные:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
 
Эта команда добавит к флагам, используемым при сборке 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, в котором начинают реализовывать фичи следующего стандарта.
=== Папка с хедерами ===
Первое - мы не хотим, чтобы буст подключался к нам статически (т.е. хотим динамическую линковку). <span style="color:#a0a0a0">Если ты, %username%, не знаешь, что это, пока просто забей и используй этот флаг так, как написано. Но в ближайшее время узнай, о чем речь.</span>
Второй флаг разрешает бусту внутри своих магических реализации реализаций использовать треды для распараллеливания и прочих радостей.
Итак, мы установили флаги. Давайте найдем буст!
Допустим, нам нужны компоненты буста под названием chrono (библиотека для работы со временем) и filesystem (библиотека для работы с файловой системой):  find_package(Boost COMPONENTS chrono filesystem REQUIRED) Win, будут искаться только нужные библиотеки, и их расположение будет записано в переменную Boost_LIBRARIES.
Нашли. Опция "REQUIRED" говорит о том, что библиотека необходима проекту.
Без нее cmake решит, что отсутствие данной библиотеки - не так уж и страшно, и будет собирать дальше.
 
Добавим директории с хедерами буста для поиска в них хедеров:
 
include_directories(${Boost_INCLUDE_DIRS})
 
Итак, осталось найденные библиотеки подключить к исполняемому файлу.
 
target_link_libraries(test ${Boost_LIBRARIES})
 
В качестве библиотек нужно указать пути к необходимым собранным библиотекам. cmake нашел указанные нами библиотеки и записал в переменную, чем мы и пользуемся.
 
Заметим, что эту команду нужно вызывать после того, как создан target сборки (через add_executable).
 
=== Пример хорошего CMakeLists.txt и где он будет лежать ===
 
Итак, полный пример использования всего этого. У нас есть некая директория (отныне считаем ее "/sources"), и в ней лежат исходники
 
/sources/lib1/main.cpp
/sources/lib2/main.cpp
/sources/main.cpp
 
В корне "/" лежит файл "/CMakeLists.txt":
 
cmake_minimum_required(VERSION 2.8)
project(cmake-example)
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost COMPONENTS chrono filesystem REQUIRED)
set(CMAKE_CXX_FLAGS "$\$${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
set(SRC_LIST lib1/main.cpp lib2/main.cpp main.cpp)
add_executable($\$${PROJECT_NAME} $\$${SRC_LIST})
target_link_libraries($\$${PROJECT_NAME} $\$${Boost_LIBRARIES})
 
Если Вам что-то в нём не понятно - перечитайте соответствующую информацию выше.
 
Создаем директорию "/build" ('''не''' "/sources/build"), переходим в нее, запускаем в ней "cmake ..".
".." - метка родительской директории.
cmake возьмет из нее наш CMakeLists.txt и по нему создаст проект в папке "/build".
Чтобы проект собрать, запускаем "make" в той же папке "/build".
 
Таким образом, в корне у нас есть:
 
* CMakeLists.txt
* директория с исходниками
* каталог сборки
 
Все разделено, автоматизировано и удобно.
 
=== Как создать библиотеку в поддиректории и слинковать ее с основной программой ===
 
Пусть в ./ лежит основной проект, а в ./subdir мы хотим сделать либу, а в ./build построить проект.
 
./subdir/CMakeLists.txt
project(MegaLibrary)
set(SOURCES lib.cpp)
set(HEADERS lib.h)
add_library(lib $\$${SOURCES} $\$${HEADERS})
target_include_directories(lib PUBLIC $\$${CMAKE_CURRENT_SOURCE_DIR})
 
./CMakeLists.txt
project(MainProject)
set(MAIN_PROJECT_SRC_LIST main)
# Other stuff
 
add_executable(main $\$${MAIN_PROJECT_SRC_LIST})
add_subdirectory(subdir)
target_link_libraries(main lib)
 
Теперь можно в файлах основного проекта делать #include "lib.h" (см. документацию по target_include_directories).
 
В ./build запускаем "cmake .. && make" и получаем собранный проект.
 
= Как использовать CMake в связке с QtCreator =
 
Интеграция с cmake у QtCreator не очень тесная, тем не менее, работать с ним можно.
 
Создаем новый проект без использования Qt, выбираем "Проект на С++ с использованием CMake". Создастся дефолтный файл сборки, который просто добавляет все исходники в директории проекта и компилирует их в один бинарник.
 
=== Как добавить header в проект, чтобы его было видно в списке файлов ===
 
Если вы создали файл header.h в директорию проекта, просто строчку
 
add_executable($\$${PROJECT_NAME} $\$${SRC_LIST})
 
измените на
 
add_executable($\$${PROJECT_NAME} $\$${SRC_LIST} "header.h")
Анонимный участник

Навигация