Я не спрашиваю об этом только для себя. Я надеюсь, что этот вопрос послужит справкой для многих новичков, которые, как и я, нашли его совершенно озадаченным, что именно происходило за кулисами, когда для такого маленького CMakeLists.txt
файла
cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)
и такой маленький tutorial.cpp
int main() { return 0; }
генерируется так много файлов
CMakeCache.txt cmake_install.cmake Makefile
CMakeLists.txt tutorial.cpp
и CMakeFiles
папка с таким количеством файлов и папок
CMakeCCompiler.cmake CMakeOutput.log Makefile.cmake
cmake.check_cache CMakeSystem.cmake progress.marks
CMakeCXXCompiler.cmake CMakeTmp TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin CompilerIdC Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin CompilerIdCXX
CMakeDirectoryInformation.cmake Makefile2
Непонимание того, что происходило за кулисами (т. Е. Почему файлы должны были создаваться и какова их цель), было самым большим препятствием на пути изучения CMake.
Если кто-нибудь знает, не могли бы вы объяснить это ради потомков? Какова цель этих файлов, и когда я печатаю cmake .
, что именно конфигурирует и генерирует cmake перед сборкой проекта?
Ответы:
Секрет в том, что вам не нужно понимать, что делают сгенерированные файлы.
CMake вносит много сложностей в систему сборки, большая часть которой окупается, только если вы используете ее для создания сложных программных проектов.
Хорошая новость заключается в том, что CMake отлично справляется с тем, чтобы скрыть от вас много этого беспорядка: используйте сборки из исходного кода, и вам даже не нужно смотреть на сгенерированные файлы. Если вы до сих пор этого не делали (что, как мне кажется, имеет место, поскольку вы написали
cmake .
), пожалуйста, проверьте их, прежде чем продолжить . Смешивать каталог сборки и исходный код очень сложно с CMake, и это не то, как система должна использоваться.В двух словах: вместо
всегда использовать
вместо. Я обычно использую пустую подпапку
build
внутри моего исходного каталога как каталог сборки.Чтобы облегчить вашу боль, позвольте мне дать краткий обзор соответствующих файлов, которые генерирует CMake:
ccmake
илиcmake-gui
. Это может быть полезно время от времени, но я бы порекомендовал использовать вышеупомянутые инструменты для изменения любого из значений, если это возможно.CMakeFiles
подкаталога.В общем, вы не должны связываться ни с одним из файлов, которые CMake генерирует для вас. Все проблемы могут быть решены изнутри
CMakeLists.txt
так или иначе. Пока результат строит ваш проект, как ожидалось, у вас, вероятно, все в порядке. Не беспокойтесь слишком сильно о кровавых деталях - так как именно это CMake пытался избавить вас в первую очередь.источник
CMakeFiles
Каталог содержитCMakeError.log
иCMakeOutput.log
важные для устранения неполадок сборки CMake.CMakeFiles/target_name.dir
каталоге являютсяflags.make
иlink.txt
файлы. Я должен был проверить это в сложном проекте, который унаследовал флаги / связанный материал от проектов верхнего уровня. Например: У меня были некоторые ошибки, потому что TPL A зависел от TPL B. Также у моего проекта была зависимость от B, который я установил локально; но A использовал версию B из моей системы (а не из локальной установки), в которой были включены различные опции, и она появилась первой, что привело к ошибкам в моем проекте. Только глядя на link.txt, я смог узнать, что это происходит.Как указано на его сайте:
В большинстве случаев он используется для генерации файлов проекта / создания - в вашем примере он создал те,
Makefile
которые используются для сборки вашего программного обеспечения (в основном на платформе Linux / Unix).Cmake позволяет предоставлять кросс-платформенные файлы сборки, которые генерируют файлы проекта / сборки для конкретной платформы для конкретной компиляции / платформы.
Например, вы можете попробовать скомпилировать свое программное обеспечение в Windows с помощью Visual Studio, а затем с правильным синтаксисом в своем
CMakeLists.txt
файле запуститьв каталоге вашего проекта на платформе Windows Cmake сгенерирует все необходимые файлы проекта / решения (
.sln
и т. д.).Если вы хотите построить свое программное обеспечение на платформе Linux / Unix, вы просто перейдете в исходный каталог, где у вас есть
CMakeLists.txt
файл, и запустите его,cmake .
и он сгенерирует все файлы, необходимые для создания программного обеспечения с помощью простогоmake
илиmake all
.Здесь у вас есть очень хорошая презентация о ключевых функциональных возможностях Cmake http://www.elpauer.org/stuff/learning_cmake.pdf
РЕДАКТИРОВАТЬ
Если вы хотите, чтобы зависимая от платформы библиотека включала / определения переменных и т. Д., Вы можете использовать этот синтаксис в
CMakeLists.txt
файлеСуществует также множество команд, с помощью которых вы можете предотвратить сбой сборки, и вместо этого Cmake уведомит вас о том, что, например, у вас нет библиотек boost
filesystem
и которыеregex
установлены в вашей системе. Для этого вы можете использовать следующий синтаксис:Проверив, что он сгенерирует make-файлы для соответствующей системы / IDE / компилятора.
источник
Как именно работает CMake - это вопрос для разработчиков, поэтому здесь нельзя ответить на этот вопрос.
Тем не менее, мы можем дать несколько полезных советов относительно того, когда вам следует использовать CMake и когда вам нужно беспокоиться о том, как он работает. Я также не фанат ответов «о, это просто работает» - потому что, особенно в программном обеспечении, НИЧТО никогда не «просто работает», и вы ВСЕГДА должны в какой-то момент разбираться с мельчайшими подробностями.
CMake - инструмент промышленной прочности. Он автоматизирует несколько ОЧЕНЬ сложных процессов и учитывает многие переменные, о которых вы можете не знать, особенно как довольно новый разработчик, возможно, работающий с ограниченными знаниями обо всех операционных системах и инструментах сборки, которые может обрабатывать CMake. Причина, по которой генерируется так много файлов и почему вещи кажутся такими сложными, заключается в том, что все эти другие системы сложны и должны учитываться и автоматизироваться. Кроме того, существуют проблемы «кэширования» и других возможностей инструмента, позволяющих сэкономить время. Чтобы понять все в CMake, нужно понимать все, что есть в этих инструментах сборки и ОС, и все возможные комбинации этих переменных, что, как вы можете себе представить, невозможно.
Важно отметить, что если вы не отвечаете за управление большой кроссплатформенной системой сборки, а ваша кодовая база составляет несколько KLOC, может быть, до 100KLOG, использование CMake похоже на использование удаления лесного дерева стоимостью 100 000 долларов. Машина для удаления сорняков из 2 футов на 2 фута цветника. (Кстати, если вы никогда не видели такую машину, вы должны искать ее на YouTube, они потрясающие)
Если ваша система сборки небольшая и простая, вероятно, будет лучше просто написать свои собственные файлы сборки вручную или написать их самостоятельно. Когда ваши make-файлы становятся громоздкими или вам нужно собрать версию вашей системы на другой платформе, вы можете переключиться на CMake. На этом этапе вам предстоит решить множество проблем, и вы сможете задать более конкретные вопросы по этому поводу. А пока посмотрите некоторые замечательные книги, написанные о CMake, или, что еще лучше, напишите одну самостоятельно! 8)
источник