Личный опыт разработки ПО

Сборник рецептов

Сборка проектов с CMake. Введение

комментариев 14

Для автоматизации сборки проектов традиционно используют системы сборки, такие как make на Unix подобных системах и nmake для компилятора Microsoft. Также традиционно написание файлов для сборки проекта под эти системы является задачей нетривиальной. Конечно в пользуясь только Mictosoft Visual Studio можно даже не подозревать о существовании этих файлов, так как интегрированная среда разработки достаточно удобно скрывает всю кухню, оставляя снаружи несколько диалоговых окон и кнопку Build. Но для сложных проектов использующих массу сторонних библиотек и кроссплатформенных проектов такой подход часто оказывается неприемлемым.

Кратко говоря make-файл представляет из себя описания последовательности действий необходимых для того чтобы достичь какой либо цели, например скомпилировать программу. На псевдокоде это может выглядеть примерно так:

Что нужно сделать?

Собрать программу hello_world.

Как ее делать?

Взять файлы hello_world.h и hello_world.cpp и запустить компилятор передав их в качестве параметров.

Что делать когда компилятор закончит работать?

Взять получившийся в результате работы компилятора объектный файлы hello_world.o и запустить линковщик передав ему этот файл.

Все.

Причем каждый подпроект может иметь свой файл сборки, а главный make-файл сможет пройти рекурсивно по подпроектам, выполнив его файл сборки, а потом собрать проект из этих компонентов.

Выглядит все просто, проблемы возникают дальше и проблем несколько:

  1. Разрешение зависимостей возникающих между частями проекта
  2. Синтаксическая сложность и неоднозначность классических make-файлов
  3. Привязка к конкретной утилите автоматической сборки и как следствие непереносимость на другие платформы

Для решения части этих проблем или всех сразу были созданы следующие инструменты: Automake (http://sourceware.org/automake/) , CMake (http://www.cmake.org/), SCons (http://www.scons.org/). Список далеко не полный.

Я предлагаю рассмотреть CMake, как простой для изучения, понятный, мощный и кроссплатформенный инструмент, который решает сразу все три проблемы. Подробности ниже.

Сам CMake не осуществляет сборку проекта, он лишь генерирует из своего файла сборки make-файл для конкретной платформы. Это может быть проект Microsoft Visual Studio, NMake makefile, проект XCode для MacOS, Unix makefile, Watcom makefile, проект Eclipse или CodeBlocks. Более того файлы CMake открывает как проект набирающая популярность среда разработки QtCreator.

Данный файл обычно называется CMakeLists.txt и содержит команды понятные CMake. Выполнив

cmake CMakeLists.txt

Мы получим либо проект который можно открыть в вашей среде разработки, либо makefile по которому можно собрать проект запустив соответствующую систему сборки (make, nmake, wmake). Всегда можно явно указать, что должна генерировать программа, указав ключ –G с нужным параметром (просто запустите cmake, чтобы увидеть доступные варианты).

Где взять CMake?

Дистрибутив CMake можно скачать с официального сайта (http://cmake.org/cmake/resources/software.html) где есть версии для всех популярных платформ или установить из репозитория вашего дистрибутива Linux, скорее всего он там уже есть.

Hello, World!

Предлагаю рассмотреть простой CMake-файл:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cmake_minimum_required (VERSION 2.6) 
 
set (PROJECT hello_world) 
 
project (${PROJECT}) 
 
set (HEADERS 
	hello.h)
 
set (SOURCES 
	hello.cpp
	main.cpp) 
 
add_executable (${PROJECT} ${HEADERS} ${SOURCES})

Что здесь происходит?

  1. В первой строке просто указана минимальная версия CMake необходимая для успешной интерпретации файла.
  2. В третьей строке определяется переменная PROJECT и ей задается значение hello_world — так будет называться наша программа.
  3. О чем и говорится в пятой строке. Конструкция ${ИМЯ_ПЕРЕМЕННОЙ} возвращает значение переменной, таким образом проект будет называться hello_world.
  4. В седьмой и десятой строках вводятся переменные содержащие список файлов необходимых для сборки проекта.
  5. И в последней строке идет команда собрать исполняемый файл с именем указанном в переменной PROJECT и из файлов имена которых находятся в переменных HEADERS и SOURCES.

Здесь написано больше, чем требует CMake, но зато этот шаблон удобно использовать где угодно, для этого достаточно изменить название проекта и имена файлов.

Как собрать библиотеку с CMake?

Точно также как и исполняемый файл, но в последней строке вместо команды add_executable, укажите команду add_library. В этом случае будет собрана статическая библиотека, для сборки динамической библиотеки надо указать параметр SHARED после имени библиотеки:

add_library (${PROJECT} SHARED ${HEADERS} ${SOURCES})

Немного о стиле

Не буду усложнять, просто расскажу о том стиле форматирования которым пользуюсь я для написания CMake-файлов. Правила достаточно лояльны:

  • Имена переменных пишутся английскими буквами в верхнем регистре
  • Команды CMake записываются английскими буквами в нижнем регистре
  • Параметры команд CMake пишутся английскими буквами в верхнем регистре
  • Команды CMake отделены пробелом от открывающей скобки

Где должен находится CMakeLists.txt?

Очень удобно в корне каждого проекта иметь директорию build с файлами сборки проекта, причем имя файла во всех директориях должно называться одинаково (название по умолчанию CMakeLists.txt отлично подойдет). Это позволит собирать сложные проекты рекурсивно подключая директории с подпроектами (о подключении подпроектов к проекту можно прочесть в моей заметке).

Создавать отдельную директорию, а не хранить файл в корне удобно, как из соображений четко организованной структуры проекта, так и потому, что CMake при работе создает ряд файлов, которые удобно хранить отдельно, чтобы не захламлять проект.

Сборка сложного проекта

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

  1. Собрать библиотеку
  2. Подключить библиотеку к проекту

С пунктом 1 сложностей возникнуть не должно, о том как собрать исполняемый файл или библиотеку написано выше.

Теперь о том как эту библиотеку подключить. Сделать это можно добавив в CMakeLists.txt проекта три строки:

1
2
3
include_directories (../)
add_subdirectory (../ИМЯ_БИБЛИОТЕКИ/build bin/ИМЯ_БИБЛИОТЕКИ)
target_link_libraries (${PROJECT} ИМЯ_БИБЛИОТЕКИ)

Первая строка нужна для того, чтобы указать путь (в данном случае это корень проекта) по которому компилятор будет искать подключаемые заголовочные файлы.

Во второй строке идет указание CMake взять файл из директории build подпроекта, выполнить его и результат работы положить в директорию ./bin/ИМЯ_БИБЛИОТЕКИ.

Третья строка должна быть в файле после команды add_executable и указывает, что проект надо линковать вместе с указанной библиотекой.

Можно добавлять эти команды вручную, но я предлагаю изменить шаблон, чтобы было можно изменять только одну строку, указывая имя библиотеки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cmake_minimum_required (VERSION 2.6)
 
set (PROJECT ИМЯ_ПРОЕКТА)
 
project (${PROJECT})
 
include_directories (../)
 
set (LIBRARIES
		ИМЯ_БИБЛИОТЕКИ_1
		ИМЯ_БИБЛИОТЕКИ_2)
 
foreach (LIBRARY ${LIBRARIES})
	add_subdirectory (../${LIBRARY}/build bin/${LIBRARY})
endforeach ()
 
set (HEADERS
		../ЗАГОЛОВОЧНЫЕ_ФАЙЛЫ)
set (SOURCES 
		../ФАЙЛЫ_С_РЕАЛИЗАЦИЕЙ)
 
add_executable (${PROJECT} ${HEADERS} ${SOURCES})
 
target_link_libraries (${PROJECT} ${LIBRARIES})

Остальные вопросы

Все хорошо, но почему в проекте Microsoft Visual Studio не показаны заголовочные файлы?

Это можно исправить добавив в файл две строки:

1
2
source_group ("Header Files" FILES ${HEADERS})
source_group ("Source Files" FILES ${SOURCES})

На работу CMake при генерации файлы для других систем это никак не повлияет.

Почему я не вижу предупреждений компилятора (warnings)?

Предупреждения можно включить следующим образом (пример для MS VS и GCC):

1
2
3
4
5
6
7
if (MSVC)
	add_definitions (/W4)
elseif (CMAKE_COMPILER_IS_GNUCXX)
	add_definitions (-Wall -pedantic)
else ()
	message ("Unknown compiler")
endif ()

На этом беглый обзор считаю можно закончить. Подробнее о CMake читайте в следующих заметках, в частности о подключении библиотек Qt и Boost.

Файл с примером

Вы можете скачать архив с примером простого проекта, собрать его и убедиться в том как действительно просто и приятно пользоваться CMake.

Скачать пример

7th Январь 2010
20:52

Рубрика: Разработка,Сборка

Метки:

14 комментариев к 'Сборка проектов с CMake. Введение'

Подписаться на комментарии по RSS или TrackBack.

  1. Спасибо, пригодилось! Описано все что нужно для первого ознакомления.

    Николай

    31 июля 10 13:58

  2. Вот как бы еще это все красивое дело увязать с VIM — вообще было бы здорово. А то как-то все так да не так получается.

    программер

    16 сентября 10 11:16

  3. Большое спасибо. Особенно за пример.

    inst

    17 марта 11 1:25

  4. А не могли бы Вы привести дополнительно пример, где те же самые библиотеки линковались бы динамически? У меня возникли некоторые проблемы с компилятором Visual Studio. Столкнулся с обозначением функций и классов как экспортируемых.

    Более подробно о проблеме тут: http://www.vtk.org/Wiki/BuildingWinDLL

    inst

    17 марта 11 21:40

  5. Здравствуйте. У меня возникла проблема … cmake выдает

    Policy CMP0002 is not set: Logical target names must be globally unique.
    Run «cmake —help-policy CMP0002» for policy details. Use the cmake_policy
    command to set the policy and suppress this warning.
    This warning is for project developers. Use -Wno-dev to suppress it.

    дело в том что у меня есть одна библиотека … ее линкуют два теста отдельно
    если создавать тесты по отдельности, то все хорошо предупреждений нет …
    видимо получается что cmake не может дважды добавить одну и туже библиотеку … как сделать так чтобы при совместной сборке cmake определил … что если библиотека уже подключена к проекту, то второй раз ее добавлять не надо ?

    lord.tiran

    17 июня 11 16:35

  6. Ппц, спасибо огромное, курсовая спасена)))

    Егор

    23 мая 12 20:08

  7. Спасибо! Лучшая вводная статья по CMAKE.

    Игорь

    15 июня 12 14:54

  8. Весьма дельная статья! Спасибо!

    Вадим

    16 ноября 13 16:45

  9. Hello there! [url=http://valtrex365.com/]buy valtrex with no prescription[/url] , [url=http://buylevitra03.com/]purchase levitra[/url] , [url=http://cialis-365.com/]buy cialis no prescription[/url] , [url=http://canadianpharmacyonline365.net/]doxycycline online pharmacy[/url] very good internet site.

    BradleyKt

    10 октября 15 14:52

  10. Продвижение и поисковая оптимизация. Маркетинг,продвижение и. И сайтов. Маркетинг, продвижение и поисковая оптимизациясайтов. Поисковая оптимизация. Продвижение и поисковая. Поисковая оптимизация.поисковых машин и сайтов. И поисковая оптимизация. Сайтов специалист. Веб. Маркетинг, продвижение и. В курсе веб-маркетинг, продвижение и оптимизациясайтов. Продвижение и поисковая. Специалист интернет маркетинг продвижение ипоисковая оптимизация сайтов web optimization 2014 torrent. Прайсы оптимизация сайта Продвижение и поисковая. И оптимизация сайтов.маркетинг, продвижение и.
    Продвижение и поисковая. И оптимизация сайтов.маркетинг, продвижение и. Поисковая оптимизация. Машин и сайтов. Маркетинг,продвижение и поисковая. В курсе интернет-маркетинг, продвижение и.поисковая оптимизация. Веб-сайтов и. Специалист интернет маркетинг продвижение ипоисковая оптимизация сайтов web optimization 2014 torrent. В курсе веб-маркетинг, продвижение и оптимизациясайтов. Продвижение и поисковая. Продвижение сайтов под ключ Скачать видео курс интернет маркетинг продвижение ипоисковая search engine marketing оптимизация сайтов торрент. Специалист продвижение и поисковая оптимизациясайтов 2011 torrent потрясающе всемирная.
    Проходит время — 6-12 месяцев и более — допустим, часть слов вышло в лидеры, прошло еще время в общем, годы, Вы продвигаетесь по этим же фразам, их количество не меняется, то есть, Вы всё стараетесь продвинуть сайт под то же количество слов, на которое договаривались изначально, web optimization сайта делается по одному и тому же количеству ключевиков.

    Большую часть информации по теме оптимизации сайтов и их продвижению в поисковых системах люди обычно черпают из сети интернет. В этом нет ничего удивительного. Тема специфическая, понятная далеко не всем. Но теперь ситуация может несколько измениться, так как не так давно на свет вышла очень хорошая книга по теме поисковой оптимизации под названием «Оптимизация и продвижение сайтов в поисковых системах».
    Всего книга «Оптимизация и продвижение сайтов в поисковых системах» содержит примерно four hundred страниц текста. В конце каждой главы приведены интересные ссылки по теме, которые подробнее освещают вопросы, затронутые авторами. Наконец, бонусом к книге является специальный CD-диск, на котором представлено достаточно большое количество информации. Я бы выделил архив избранных статей сотрудников компании «Ашманов и Партнеры» и архив рассылки «Продвижение сайтов. Профессиональные советы экспертов». На мой взгляд, данные сборники статей служат отличным дополнением к книге.
    Мы не даем пустых обещаний, поскольку руководствуемся исключительно собственными наработками в оптимизации сайтов и результатами аналитических исследований. Уже на начальном этапе вы можете оценить стоимость привлечения каждого посетителя. Представить, какие результаты и когда даст оптимизация сайта. И всё это до того, как будет начато продвижение в ТОП.

    Раскрутка сайта и продвижение сайта приведут к Вам потенциальных клиентов, но это еще не гарантирует продажи. Раскрутить сайт еще не означает увеличить продажи. Очень важно, чтобы тексты на сайте правильно воспринимались посетителями, ведь это — Ваше развернутое коммерческое предложение. Они должны сформировать у посетителя лояльное, позитивное отношение к товару, владельцу ресурса, и правильное восприятие его коммерческих предложений. Именно эту задачу и выполняет копирайтинг, это не просто написание текста, а еще и формирование положительного отношения у читателя к компании и ее предложениям. Написать хорошие тексты для сайта автоматически означает увеличить продажи!
    Преподаватель с огромным опытом практической работы. Профессионально знает html & css, веб-дизайн, владеет работой с flash, растровой и векторной графикой, PHP и серверами. Богатый опыт практической работы и глубокие знания позволяют Кириллу Владимировичу излагать учебный материал доступно и понятно, живо и интересно. Именно эти особенности Кирилла Успенского отмечают слушатели в своих многочисленных благодарных отзывах.
    В наше время защита Отечества — это далеко не только умение стрелять из автомата или водить боевую машину. Защита Отечества — это прежде всего интеллект, владение новейшими технологиями, получение актуальных знаний и уверенное их применение! А поскольку защита Отечества — дело настоящих мужчин, именно настоящие мужчины должны быть здесь примером для всех!

    На авторизованных курсах Лаборатории Касперского в Центре «Специалист» Вы изучите новейшие методы защиты информационной системы предприятия: облачную защиту (Kaspersky Safety Network), контроль запуска программ, создание белых списков, а также сетевые экраны и контроль внешних устройств. Вы овладеете масштабированием и администрированием логической сети Kaspersky Endpoint Security и миграцией с предыдущей версией продукта. Вы не только получите глубокие теоретические знания, но и закрепите их, выполняя лабораторные работы.
    Если ваш сайт только что создан, и о нем пока мало кто знает, вам идеально подойдет наша программа «Старт». Она включает в себя сочетание необходимых базовых услуг SEARCH ENGINE OPTIMISATION, которые помогут вашему сайту начать быстро развиваться. Если у вас есть веб-ресурс, у вас есть потенциал привлечь многотысячную целевую аудиторию и быть в пределах онлайн-досягаемости, несмотря на «юный возраст» вашего сайта!
    Сколько это стоит? Единой ставки не существует. Стоимость поисковой оптимизации сайта варьируется в зависимости от того, насколько уже оптимизирован данный сайт и какие позиции он имеет в поисковых системах по целевым запросам. На основе этого фактора и уровня желаемого результата рассчитывается цена оптимизации и дальнейшего продвижения сайта. То есть, она зависит от объема работы, который необходимо выполнить, чтобы оптимизировать сайт до необходимого уровня.

    Какие же есть методы поисковой оптимизации ресурса? А их всего три: черная, белая и серая поисковая оптимизация. Черная поисковая оптимизация — это использование запрещенных методов: дорвеи и другие. Белая поисковая оптимизация — это долгий процесс, но разрешенный. Используются исключительно белые методы (МЕТА-теги, ключевые слова, описания). И серые методы поисковой оптимизации — это не полностью черная оптимизация, а злоупотребление МЕТА-тегами, ключевыми словами, описаниями. За серую оптимизацию вас могут забанить временно, учтем, что в черной поисковой оптимизации банят на неопределенный срок.
    Сайт тормозит, и вы не представляете, как с этим справиться? Количество анимации на странице превысило все мыслимые и немыслимые границы, и вы не знаете что делать? На internet-странице десятки и сотни картинок, internet-дизайнер превзошел сам себя, и теперь все это загружается страшно медленно? Этот учебник по оптимизации поможет разобраться со множеством проблем, связанных с клиентской производительностью при оптимизации сайта. В учебнике рассмотрены оптимизация картинок, HTML-, CSS-, Javascript-файлов сайта, их сжатие, объединение, используемые для этого бесплатные программы и ресурсы в Интернете.
    Негпупые сайтовладельцы скажут вам, что сбор и использование данных веб-аналитики — это непременное условие для успешной оптимизации сайта. Это правда, потому что данные веб-аналитики предоставляют громадное количество информации о том, что посетители делают на сайте: что они читают, их перемещение по сайту, что покупают и чего совсем не замечают. Собирая, анализируя и используя этот источник информации, можно достичь максимальной оптимизации и эффективной работы сайта. А сервис Google Analytics поможет вам в этом.
    продвижения сайтов бесплатно: полезные подсказки на http://promote-my.website/component/content/article/3-internet-reklama/4-internet-vmesto-televizora.html

    Manyushko63

    15 ноября 15 14:55

  11. Привет! Обратите внимание на то, что на вкладке Packages пакет Python не включен в минимальную сборку. Вы можете добавить его, просто установив флажок напротив пакета

    slavagames.net

    15 марта 16 9:52

  12. Overall Facts About this produce most common std

    canada drugs pharmacy

    23 марта 17 11:50

  13. Unspecialized Communication Around this output health insurance in the united states

  14. General Point Helter-skelter this by-product

    online pharmacies

    14 мая 17 15:37

Оставить комментарий