<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.66.58.178&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.66.58.178&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.66.58.178"/>
		<updated>2026-04-06T13:58:35Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=CMake_Tutorial&amp;diff=63462</id>
		<title>CMake Tutorial</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=CMake_Tutorial&amp;diff=63462"/>
				<updated>2018-01-12T14:37:21Z</updated>
		
		<summary type="html">&lt;p&gt;178.66.58.178: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
= Что это и зачем нужно =&lt;br /&gt;
CMake — кроссплатформенная автоматизированная система сборки проектов.&lt;br /&gt;
Непосредственно сборкой она не занимается, а только генерирует Makefile, который потом будет выполнен утилитой make. &lt;br /&gt;
&lt;br /&gt;
CMake может проверять наличие необходимых библиотек и подключать их, собирать проекты под разными компиляторами и операционными системами. Т.е. у вас есть куча кода и файлик, содержащий информацию для cmake, и чтобы скомпилить &lt;br /&gt;
это дело где-нибудь еще, вам нужно просто запустить там cmake, который сделает всё сам. Удобно, полезно, просто.&lt;br /&gt;
&lt;br /&gt;
=== Если по лайту ===&lt;br /&gt;
Если нет желания/времени/сил читать весь туториал и Вы используете какой-нибудь QtCreator (или любая другая IDE, умеющая работать с cmake), то:&lt;br /&gt;
&lt;br /&gt;
* Создайте в IDE проект под cmake&lt;br /&gt;
* Найдите в папке с проектом CMakeFiles.txt&lt;br /&gt;
* Пробегитесь глазами по туториалу, соотнося его с вашим CMakeFiles.txt&lt;br /&gt;
&lt;br /&gt;
Про подключение библиотек рекомендуется все-таки прочитать целиком.&lt;br /&gt;
&lt;br /&gt;
= Старт =&lt;br /&gt;
Предполагается, что найти и скачать сам cmake ты, %username%, в состоянии. //а если нет?&lt;br /&gt;
&lt;br /&gt;
Предположим, у Вас есть исходничек &amp;quot;test.cpp&amp;quot; (// а если нет?).&lt;br /&gt;
Для начала нужно создать файлик для cmake, который обычно называют &amp;quot;CMakeLists.txt&amp;quot;, и написать туда вот это:&lt;br /&gt;
&lt;br /&gt;
 add_executable(test test.cpp)&lt;br /&gt;
&lt;br /&gt;
Теперь запускаем (из консоли) в этой папке команду &amp;quot;cmake CMakeLists.txt&amp;quot; (аргументом можно передавать не только файл, но и директорию, в которой он лежит, тогда cmake найдет его сам).&lt;br /&gt;
&lt;br /&gt;
cmake будет использовать переданный (или найденный) файл проекта (тот самый CMakeLists.txt), и в '''текущей''' директории будет создавать проект.&lt;br /&gt;
Проект - это много-много файлов и директорий (примечание: поэтому лучше запускать cmake из другой директории, чтобы можно было, например, быстро удалить все бинарники), из которых нас больше всего интересует Makefile.&lt;br /&gt;
&lt;br /&gt;
Makefile - это файл, нужный для утилиты make.&lt;br /&gt;
Именно она запускает компиляторы, линковщики и прочие радости. Запускаем make в '''каталоге сборки''' (т.е. там же, где Вы запускали cmake). &lt;br /&gt;
В консоли вылезет примерно такой текст:&lt;br /&gt;
&lt;br /&gt;
 Scanning dependencies of target test&lt;br /&gt;
 [100%] Building CXX object CMakeFiles/test.dir/test.cpp.o&lt;br /&gt;
 Linking CXX executable test&lt;br /&gt;
 [100%] Built target test&lt;br /&gt;
&lt;br /&gt;
А у Вас в папочке появится исполняемый файл &amp;quot;test&amp;quot;. Запустите, убедитесь, что это действительно то, что ожидается от компилляции файла &amp;quot;test.cpp&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= We need to go deeper =&lt;br /&gt;
&lt;br /&gt;
Поразбираемся с различными возможностями cmake.&lt;br /&gt;
&lt;br /&gt;
=== Указание необходимой версии cmake ===&lt;br /&gt;
&lt;br /&gt;
 cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
&lt;br /&gt;
Если используемая версия cmake меньше 2.6, он не захочет работать. Писать эту команду всегда - хороший стиль (cmake будет пыхтеть и обижаться, если вы не укажете версию, но собирать всё равно всё будет).&lt;br /&gt;
&lt;br /&gt;
=== Название проекта ===&lt;br /&gt;
&lt;br /&gt;
 project(visualization)&lt;br /&gt;
&lt;br /&gt;
Указывает, что этот cmake-файл является корневым для некоторого проекта. С проектами связаны определенные переменные и поведение cmake (читайте документацию).&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
&lt;br /&gt;
В cmake можно создавать текстовые переменные. Команда&lt;br /&gt;
&lt;br /&gt;
 set(VARIABLE The variable's value)&lt;br /&gt;
&lt;br /&gt;
запишет в переменную &amp;quot;VARIABLE&amp;quot; значение &amp;quot;The variable's value&amp;quot;.&lt;br /&gt;
Чтобы где-либо использовать значение этой переменной, нужно написать ${VARIABLE}.&lt;br /&gt;
&lt;br /&gt;
Чтобы добавить к переменной некий текст, можно сделать так:&lt;br /&gt;
&lt;br /&gt;
 set(VARIABLE &amp;quot;${VARIABLE} new text&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Как видите, использовать значение можно и внутри кавычек.&lt;br /&gt;
Переменные активно используются различными библиотеками - для установки флагов, параметров сборки/линковки и прочих вкусностей, об этом чуть-чуть попозже.&lt;br /&gt;
&lt;br /&gt;
Пример коше'гного проекта со списком сорцов в отдельной переменной:&lt;br /&gt;
&lt;br /&gt;
 cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
 &lt;br /&gt;
 set(SOURCES test.cpp lib1.cpp lib2.cpp)&lt;br /&gt;
 &lt;br /&gt;
 add_executable(test ${SOURCES})&lt;br /&gt;
&lt;br /&gt;
=== Устанавливаем команды компилятору ===&lt;br /&gt;
&lt;br /&gt;
 add_definitions(-DSOME_IMPORTANT_DEFINITION)&lt;br /&gt;
&lt;br /&gt;
Эта команда используется для установки дефайнов, которыe можно проверить в коде через, например, #ifdef SOME_IMPORTANT_DEFINITION.&lt;br /&gt;
&lt;br /&gt;
 set(CMAKE_CXX_FLAGS &amp;quot;${CMAKE_CXX_FLAGS} -std=c++11 -Wall&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Эта команда добавит к флагам, используемым при сборке c++-кода, флаги -std=c++11 и -Wall.&lt;br /&gt;
&lt;br /&gt;
Кто не знает: &amp;quot;-std=c++11&amp;quot; включает в gcc поддержку стандарта c++11, &amp;quot;-Wall&amp;quot; говорит gcc выводить все предупреждения (очень советую, помогает отловить много глупых багов и писать аккуратный код).&lt;br /&gt;
&lt;br /&gt;
Если ваша версия GCC меньше, чем 4.7.0, вместо -std=c++11 нужно использовать -std=c++0x.&lt;br /&gt;
&lt;br /&gt;
В GCC 4.8.0 появился флаг -std=c++1y, в котором начинают реализовывать фичи следующего стандарта.&lt;br /&gt;
&lt;br /&gt;
=== Папка с хедерами ===&lt;br /&gt;
&lt;br /&gt;
Допустим, Вы хотите, чтобы хедеры (файлики, подключаемые через #include) искались еще и в каталогах &amp;quot;headers/&amp;quot; и &amp;quot;more_headers/&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 include_directories(&amp;quot;headers/&amp;quot; &amp;quot;more_headers/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Надеюсь, и это понятно.&lt;br /&gt;
&lt;br /&gt;
=== Самое важное - подключение библиотек ===&lt;br /&gt;
&lt;br /&gt;
Научимся искать и подключать библиотеки при помощи cmake на примере Boost.&lt;br /&gt;
Для начала установим переменные для буста:&lt;br /&gt;
&lt;br /&gt;
 set(Boost_USE_STATIC_LIBS OFF)&lt;br /&gt;
 set(Boost_USE_MULTITHREADED ON)&lt;br /&gt;
&lt;br /&gt;
Первое - мы не хотим, чтобы буст подключался к нам статически (т.е. хотим динамическую линковку). &amp;lt;span style=&amp;quot;color:#a0a0a0&amp;quot;&amp;gt;Если ты, %username%, не знаешь, что это, пока просто забей и используй этот флаг так, как написано. Но в ближайшее время узнай, о чем речь.&amp;lt;/span&amp;gt;  &lt;br /&gt;
Второй флаг разрешает бусту внутри своих магических реализаций использовать треды для распараллеливания и прочих радостей.&lt;br /&gt;
&lt;br /&gt;
Итак, мы установили флаги. Давайте найдем буст!&lt;br /&gt;
&lt;br /&gt;
Допустим, нам нужны компоненты буста под названием chrono (библиотека для работы со временем) и filesystem (библиотека для работы с файловой системой):&lt;br /&gt;
&lt;br /&gt;
 find_package(Boost COMPONENTS chrono filesystem REQUIRED)&lt;br /&gt;
&lt;br /&gt;
Win, будут искаться только нужные библиотеки, и их расположение будет записано в переменную Boost_LIBRARIES.&lt;br /&gt;
&lt;br /&gt;
Опция &amp;quot;REQUIRED&amp;quot; говорит о том, что библиотека необходима проекту.&lt;br /&gt;
Без нее cmake решит, что отсутствие данной библиотеки - не так уж и страшно, и будет собирать дальше.&lt;br /&gt;
&lt;br /&gt;
Добавим директории с хедерами буста для поиска в них хедеров:&lt;br /&gt;
&lt;br /&gt;
 include_directories(${Boost_INCLUDE_DIRS})&lt;br /&gt;
&lt;br /&gt;
Итак, осталось найденные библиотеки подключить к исполняемому файлу.&lt;br /&gt;
&lt;br /&gt;
 target_link_libraries(test ${Boost_LIBRARIES})&lt;br /&gt;
&lt;br /&gt;
В качестве библиотек нужно указать пути к необходимым собранным библиотекам. cmake нашел указанные нами библиотеки и записал в переменную, чем мы и пользуемся.&lt;br /&gt;
&lt;br /&gt;
Заметим, что эту команду нужно вызывать после того, как создан target сборки (через add_executable).&lt;br /&gt;
&lt;br /&gt;
=== Пример хорошего CMakeLists.txt и где он будет лежать ===&lt;br /&gt;
&lt;br /&gt;
Итак, полный пример использования всего этого. У нас есть некая директория (отныне считаем ее &amp;quot;/sources&amp;quot;), и в ней лежат исходники&lt;br /&gt;
&lt;br /&gt;
 /sources/lib1/main.cpp&lt;br /&gt;
 /sources/lib2/main.cpp&lt;br /&gt;
 /sources/main.cpp&lt;br /&gt;
&lt;br /&gt;
В корне &amp;quot;/&amp;quot; лежит файл &amp;quot;/CMakeLists.txt&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 cmake_minimum_required(VERSION 2.8)&lt;br /&gt;
 project(cmake-example)&lt;br /&gt;
 &lt;br /&gt;
 set(Boost_USE_STATIC_LIBS OFF)&lt;br /&gt;
 set(Boost_USE_MULTITHREADED ON)&lt;br /&gt;
 find_package(Boost COMPONENTS chrono filesystem REQUIRED)&lt;br /&gt;
 &lt;br /&gt;
 set(CMAKE_CXX_FLAGS &amp;quot;${CMAKE_CXX_FLAGS} -std=c++11 -Wall&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 set(SRC_LIST lib1/main.cpp lib2/main.cpp main.cpp)&lt;br /&gt;
 &lt;br /&gt;
 add_executable(${PROJECT_NAME} ${SRC_LIST})&lt;br /&gt;
 target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})&lt;br /&gt;
&lt;br /&gt;
Если Вам что-то в нём не понятно - перечитайте соответствующую информацию выше.&lt;br /&gt;
&lt;br /&gt;
Создаем директорию &amp;quot;/build&amp;quot; ('''не''' &amp;quot;/sources/build&amp;quot;), переходим в нее, запускаем в ней &amp;quot;cmake ..&amp;quot;.&lt;br /&gt;
&amp;quot;..&amp;quot; - метка родительской директории.&lt;br /&gt;
cmake возьмет из нее наш CMakeLists.txt и по нему создаст проект в папке &amp;quot;/build&amp;quot;.&lt;br /&gt;
Чтобы проект собрать, запускаем &amp;quot;make&amp;quot; в той же папке &amp;quot;/build&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в корне у нас есть:&lt;br /&gt;
&lt;br /&gt;
* CMakeLists.txt&lt;br /&gt;
* директория с исходниками&lt;br /&gt;
* каталог сборки&lt;br /&gt;
&lt;br /&gt;
Все разделено, автоматизировано и удобно.&lt;br /&gt;
&lt;br /&gt;
=== Как создать библиотеку в поддиректории и слинковать ее с основной программой ===&lt;br /&gt;
&lt;br /&gt;
Пусть в ./ лежит основной проект, а в ./subdir мы хотим сделать либу, а в ./build построить проект.&lt;br /&gt;
&lt;br /&gt;
./subdir/CMakeLists.txt&lt;br /&gt;
 project(MegaLibrary)&lt;br /&gt;
 set(SOURCES lib.cpp)&lt;br /&gt;
 set(HEADERS lib.h)&lt;br /&gt;
 add_library(lib ${SOURCES} ${HEADERS})&lt;br /&gt;
 target_include_directories(lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})&lt;br /&gt;
&lt;br /&gt;
./CMakeLists.txt&lt;br /&gt;
 project(MainProject)&lt;br /&gt;
 set(MAIN_PROJECT_SRC_LIST main)&lt;br /&gt;
 # Other stuff&lt;br /&gt;
&lt;br /&gt;
 add_executable(main ${MAIN_PROJECT_SRC_LIST})&lt;br /&gt;
 add_subdirectory(subdir)&lt;br /&gt;
 target_link_libraries(main lib)&lt;br /&gt;
&lt;br /&gt;
Теперь можно в файлах основного проекта делать #include &amp;quot;lib.h&amp;quot; (см. документацию по target_include_directories).&lt;br /&gt;
&lt;br /&gt;
В ./build запускаем &amp;quot;cmake .. &amp;amp;&amp;amp; make&amp;quot; и получаем собранный проект.&lt;br /&gt;
&lt;br /&gt;
= Как использовать CMake в связке с QtCreator =&lt;br /&gt;
&lt;br /&gt;
Интеграция с cmake у QtCreator не очень тесная, тем не менее, работать с ним можно.&lt;br /&gt;
&lt;br /&gt;
Создаем новый проект без использования Qt, выбираем &amp;quot;Проект на С++ с использованием CMake&amp;quot;. Создастся дефолтный файл сборки, который просто добавляет все исходники в директории проекта и компилирует их в один бинарник.&lt;br /&gt;
&lt;br /&gt;
=== Как добавить header в проект, чтобы его было видно в списке файлов ===&lt;br /&gt;
&lt;br /&gt;
Если вы создали файл header.h в директорию проекта, просто строчку &amp;quot;add_executable(${PROJECT_NAME} ${SRC_LIST})&amp;quot; измените на add_executable(${PROJECT_NAME} ${SRC_LIST} &amp;quot;header.h&amp;quot;)&lt;/div&gt;</summary>
		<author><name>178.66.58.178</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=CMake_Tutorial&amp;diff=63461</id>
		<title>CMake Tutorial</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=CMake_Tutorial&amp;diff=63461"/>
				<updated>2018-01-12T14:35:47Z</updated>
		
		<summary type="html">&lt;p&gt;178.66.58.178: Расширения исходников действительно не обязательно, но только для cpp-файлов. Хедеры так не найдутся.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
= Что это и зачем нужно =&lt;br /&gt;
CMake — кроссплатформенная автоматизированная система сборки проектов.&lt;br /&gt;
Непосредственно сборкой она не занимается, а только генерирует Makefile, который потом будет выполнен утилитой make. &lt;br /&gt;
&lt;br /&gt;
CMake может проверять наличие необходимых библиотек и подключать их, собирать проекты под разными компиляторами и операционными системами. Т.е. у вас есть куча кода и файлик, содержащий информацию для cmake, и чтобы скомпилить &lt;br /&gt;
это дело где-нибудь еще, вам нужно просто запустить там cmake, который сделает всё сам. Удобно, полезно, просто.&lt;br /&gt;
&lt;br /&gt;
=== Если по лайту ===&lt;br /&gt;
Если нет желания/времени/сил читать весь туториал и Вы используете какой-нибудь QtCreator (или любая другая IDE, умеющая работать с cmake), то:&lt;br /&gt;
&lt;br /&gt;
* Создайте в IDE проект под cmake&lt;br /&gt;
* Найдите в папке с проектом CMakeFiles.txt&lt;br /&gt;
* Пробегитесь глазами по туториалу, соотнося его с вашим CMakeFiles.txt&lt;br /&gt;
&lt;br /&gt;
Про подключение библиотек рекомендуется все-таки прочитать целиком.&lt;br /&gt;
&lt;br /&gt;
= Старт =&lt;br /&gt;
Предполагается, что найти и скачать сам cmake ты, %username%, в состоянии. //а если нет?&lt;br /&gt;
&lt;br /&gt;
Предположим, у Вас есть исходничек &amp;quot;test.cpp&amp;quot; (// а если нет?).&lt;br /&gt;
Для начала нужно создать файлик для cmake, который обычно называют &amp;quot;CMakeLists.txt&amp;quot;, и написать туда вот это:&lt;br /&gt;
&lt;br /&gt;
 add_executable(test test.cpp)&lt;br /&gt;
&lt;br /&gt;
Теперь запускаем (из консоли) в этой папке команду &amp;quot;cmake CMakeLists.txt&amp;quot; (аргументом можно передавать не только файл, но и директорию, в которой он лежит, тогда cmake найдет его сам).&lt;br /&gt;
&lt;br /&gt;
cmake будет использовать переданный (или найденный) файл проекта (тот самый CMakeLists.txt), и в '''текущей''' директории будет создавать проект.&lt;br /&gt;
Проект - это много-много файлов и директорий (примечание: поэтому лучше запускать cmake из другой директории, чтобы можно было, например, быстро удалить все бинарники), из которых нас больше всего интересует Makefile.&lt;br /&gt;
&lt;br /&gt;
Makefile - это файл, нужный для утилиты make.&lt;br /&gt;
Именно она запускает компиляторы, линковщики и прочие радости. Запускаем make в '''каталоге сборки''' (т.е. там же, где Вы запускали cmake). &lt;br /&gt;
В консоли вылезет примерно такой текст:&lt;br /&gt;
&lt;br /&gt;
 Scanning dependencies of target test&lt;br /&gt;
 [100%] Building CXX object CMakeFiles/test.dir/test.cpp.o&lt;br /&gt;
 Linking CXX executable test&lt;br /&gt;
 [100%] Built target test&lt;br /&gt;
&lt;br /&gt;
А у Вас в папочке появится исполняемый файл &amp;quot;test&amp;quot;. Запустите, убедитесь, что это действительно то, что ожидается от компилляции файла &amp;quot;test.cpp&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= We need to go deeper =&lt;br /&gt;
&lt;br /&gt;
Поразбираемся с различными возможностями cmake.&lt;br /&gt;
&lt;br /&gt;
=== Указание необходимой версии cmake ===&lt;br /&gt;
&lt;br /&gt;
 cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
&lt;br /&gt;
Если используемая версия cmake меньше 2.6, он не захочет работать. Писать эту команду всегда - хороший стиль (cmake будет пыхтеть и обижаться, если вы не укажете версию, но собирать всё равно всё будет).&lt;br /&gt;
&lt;br /&gt;
=== Название проекта ===&lt;br /&gt;
&lt;br /&gt;
 project(visualization)&lt;br /&gt;
&lt;br /&gt;
Указывает, что этот cmake-файл является корневым для некоторого проекта. С проектами связаны определенные переменные и поведение cmake (читайте документацию).&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
&lt;br /&gt;
В cmake можно создавать текстовые переменные. Команда&lt;br /&gt;
&lt;br /&gt;
 set(VARIABLE The variable's value)&lt;br /&gt;
&lt;br /&gt;
запишет в переменную &amp;quot;VARIABLE&amp;quot; значение &amp;quot;The variable's value&amp;quot;.&lt;br /&gt;
Чтобы где-либо использовать значение этой переменной, нужно написать ${VARIABLE}.&lt;br /&gt;
&lt;br /&gt;
Чтобы добавить к переменной некий текст, можно сделать так:&lt;br /&gt;
&lt;br /&gt;
 set(VARIABLE &amp;quot;${VARIABLE} new text&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Как видите, использовать значение можно и внутри кавычек.&lt;br /&gt;
Переменные активно используются различными библиотеками - для установки флагов, параметров сборки/линковки и прочих вкусностей, об этом чуть-чуть попозже.&lt;br /&gt;
&lt;br /&gt;
Пример коше'гного проекта со списком сорцов в отдельной переменной:&lt;br /&gt;
&lt;br /&gt;
 cmake_minimum_required(VERSION 2.6)&lt;br /&gt;
 &lt;br /&gt;
 set(SOURCES test.cpp lib1.cpp lib2.cpp)&lt;br /&gt;
 &lt;br /&gt;
 add_executable(test ${SOURCES})&lt;br /&gt;
&lt;br /&gt;
=== Устанавливаем команды компилятору ===&lt;br /&gt;
&lt;br /&gt;
 add_definitions(-DSOME_IMPORTANT_DEFINITION)&lt;br /&gt;
&lt;br /&gt;
Эта команда используется для установки дефайнов, которыe можно проверить в коде через, например, #ifdef SOME_IMPORTANT_DEFINITION.&lt;br /&gt;
&lt;br /&gt;
 set(CMAKE_CXX_FLAGS &amp;quot;${CMAKE_CXX_FLAGS} -std=c++11 -Wall&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Эта команда добавит к флагам, используемым при сборке c++-кода, флаги -std=c++11 и -Wall.&lt;br /&gt;
&lt;br /&gt;
Кто не знает: &amp;quot;-std=c++11&amp;quot; включает в gcc поддержку стандарта c++11, &amp;quot;-Wall&amp;quot; говорит gcc выводить все предупреждения (очень советую, помогает отловить много глупых багов и писать аккуратный код).&lt;br /&gt;
&lt;br /&gt;
Если ваша версия GCC меньше, чем 4.7.0, вместо -std=c++11 нужно использовать -std=c++0x.&lt;br /&gt;
&lt;br /&gt;
В GCC 4.8.0 появился флаг -std=c++1y, в котором начинают реализовывать фичи следующего стандарта.&lt;br /&gt;
&lt;br /&gt;
=== Папка с хедерами ===&lt;br /&gt;
&lt;br /&gt;
Допустим, Вы хотите, чтобы хедеры (файлики, подключаемые через #include) искались еще и в каталогах &amp;quot;headers/&amp;quot; и &amp;quot;more_headers/&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 include_directories(&amp;quot;headers/&amp;quot; &amp;quot;more_headers/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Надеюсь, и это понятно.&lt;br /&gt;
&lt;br /&gt;
=== Самое важное - подключение библиотек ===&lt;br /&gt;
&lt;br /&gt;
Научимся искать и подключать библиотеки при помощи cmake на примере Boost.&lt;br /&gt;
Для начала установим переменные для буста:&lt;br /&gt;
&lt;br /&gt;
 set(Boost_USE_STATIC_LIBS OFF)&lt;br /&gt;
 set(Boost_USE_MULTITHREADED ON)&lt;br /&gt;
&lt;br /&gt;
Первое - мы не хотим, чтобы буст подключался к нам статически (т.е. хотим динамическую линковку). &amp;lt;span style=&amp;quot;color:#a0a0a0&amp;quot;&amp;gt;Если ты, %username%, не знаешь, что это, пока просто забей и используй этот флаг так, как написано. Но в ближайшее время узнай, о чем речь.&amp;lt;/span&amp;gt;  &lt;br /&gt;
Второй флаг разрешает бусту внутри своих магических реализаций использовать треды для распараллеливания и прочих радостей.&lt;br /&gt;
&lt;br /&gt;
Итак, мы установили флаги. Давайте найдем буст!&lt;br /&gt;
&lt;br /&gt;
Допустим, нам нужны компоненты буста под названием chrono (библиотека для работы со временем) и filesystem (библиотека для работы с файловой системой):&lt;br /&gt;
&lt;br /&gt;
 find_package(Boost COMPONENTS chrono filesystem REQUIRED)&lt;br /&gt;
&lt;br /&gt;
Win, будут искаться только нужные библиотеки, и их расположение будет записано в переменную Boost_LIBRARIES.&lt;br /&gt;
&lt;br /&gt;
Опция &amp;quot;REQUIRED&amp;quot; говорит о том, что библиотека необходима проекту.&lt;br /&gt;
Без нее cmake решит, что отсутствие данной библиотеки - не так уж и страшно, и будет собирать дальше.&lt;br /&gt;
&lt;br /&gt;
Добавим директории с хедерами буста для поиска в них хедеров:&lt;br /&gt;
&lt;br /&gt;
 include_directories(${Boost_INCLUDE_DIRS})&lt;br /&gt;
&lt;br /&gt;
Итак, осталось найденные библиотеки подключить к исполняемому файлу.&lt;br /&gt;
&lt;br /&gt;
 target_link_libraries(test ${Boost_LIBRARIES})&lt;br /&gt;
&lt;br /&gt;
В качестве библиотек нужно указать пути к необходимым собранным библиотекам. cmake нашел указанные нами библиотеки и записал в переменную, чем мы и пользуемся.&lt;br /&gt;
&lt;br /&gt;
Заметим, что эту команду нужно вызывать после того, как создан target сборки (через add_executable).&lt;br /&gt;
&lt;br /&gt;
=== Пример хорошего CMakeLists.txt и где он будет лежать ===&lt;br /&gt;
&lt;br /&gt;
Итак, полный пример использования всего этого. У нас есть некая директория (отныне считаем ее &amp;quot;/sources&amp;quot;), и в ней лежат исходники&lt;br /&gt;
&lt;br /&gt;
 /sources/lib1/main.cpp&lt;br /&gt;
 /sources/lib2/main.cpp&lt;br /&gt;
 /sources/main.cpp&lt;br /&gt;
&lt;br /&gt;
В корне &amp;quot;/&amp;quot; лежит файл &amp;quot;/CMakeLists.txt&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 cmake_minimum_required(VERSION 2.8)&lt;br /&gt;
 project(cmake-example)&lt;br /&gt;
 &lt;br /&gt;
 set(Boost_USE_STATIC_LIBS OFF)&lt;br /&gt;
 set(Boost_USE_MULTITHREADED ON)&lt;br /&gt;
 find_package(Boost COMPONENTS chrono filesystem REQUIRED)&lt;br /&gt;
 &lt;br /&gt;
 set(CMAKE_CXX_FLAGS &amp;quot;${CMAKE_CXX_FLAGS} -std=c++11 -Wall&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 set(SRC_LIST lib1/main.cpp lib2/main.cpp main.cpp)&lt;br /&gt;
 &lt;br /&gt;
 add_executable(${PROJECT_NAME} ${SRC_LIST})&lt;br /&gt;
 target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})&lt;br /&gt;
&lt;br /&gt;
Если Вам что-то в нём не понятно - перечитайте соответствующую информацию выше.&lt;br /&gt;
&lt;br /&gt;
Создаем директорию &amp;quot;/build&amp;quot; ('''не''' &amp;quot;/sources/build&amp;quot;), переходим в нее, запускаем в ней &amp;quot;cmake ..&amp;quot;.&lt;br /&gt;
&amp;quot;..&amp;quot; - метка родительской директории.&lt;br /&gt;
cmake возьмет из нее наш CMakeLists.txt и по нему создаст проект в папке &amp;quot;/build&amp;quot;.&lt;br /&gt;
Чтобы проект собрать, запускаем &amp;quot;make&amp;quot; в той же папке &amp;quot;/build&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в корне у нас есть:&lt;br /&gt;
&lt;br /&gt;
* CMakeLists.txt&lt;br /&gt;
* директория с исходниками&lt;br /&gt;
* каталог сборки&lt;br /&gt;
&lt;br /&gt;
Все разделено, автоматизировано и удобно.&lt;br /&gt;
&lt;br /&gt;
=== Как создать библиотеку в поддиректории и слинковать ее с основной программой ===&lt;br /&gt;
&lt;br /&gt;
Пусть в ./ лежит основной проект, а в ./subdir мы хотим сделать либу, а в ./build построить проект.&lt;br /&gt;
&lt;br /&gt;
./subdir/CMakeLists.txt&lt;br /&gt;
 project(MegaLibrary)&lt;br /&gt;
 set(SOURCES lib.cpp)&lt;br /&gt;
 set(HEADERS lib.h)&lt;br /&gt;
 add_library(lib ${SOURCES} ${HEADERS})&lt;br /&gt;
&lt;br /&gt;
./CMakeLists.txt&lt;br /&gt;
 project(MainProject)&lt;br /&gt;
 set(MAIN_PROJECT_SRC_LIST main)&lt;br /&gt;
 # Other stuff&lt;br /&gt;
 include_directories(subdir)&lt;br /&gt;
 add_executable(main ${MAIN_PROJECT_SRC_LIST})&lt;br /&gt;
 add_subdirectory(subdir)&lt;br /&gt;
 target_link_libraries(main lib)&lt;br /&gt;
&lt;br /&gt;
Теперь можно в файлах основного проекта делать #include &amp;quot;lib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В ./build запускаем &amp;quot;cmake .. &amp;amp;&amp;amp; make&amp;quot; и получаем собранный проект.&lt;br /&gt;
&lt;br /&gt;
= Как использовать CMake в связке с QtCreator =&lt;br /&gt;
&lt;br /&gt;
Интеграция с cmake у QtCreator не очень тесная, тем не менее, работать с ним можно.&lt;br /&gt;
&lt;br /&gt;
Создаем новый проект без использования Qt, выбираем &amp;quot;Проект на С++ с использованием CMake&amp;quot;. Создастся дефолтный файл сборки, который просто добавляет все исходники в директории проекта и компилирует их в один бинарник.&lt;br /&gt;
&lt;br /&gt;
=== Как добавить header в проект, чтобы его было видно в списке файлов ===&lt;br /&gt;
&lt;br /&gt;
Если вы создали файл header.h в директорию проекта, просто строчку &amp;quot;add_executable(${PROJECT_NAME} ${SRC_LIST})&amp;quot; измените на add_executable(${PROJECT_NAME} ${SRC_LIST} &amp;quot;header.h&amp;quot;)&lt;/div&gt;</summary>
		<author><name>178.66.58.178</name></author>	</entry>

	</feed>