Какие пыльные уголки захочет узнать новичок в CMake?

Я сделал много проектов и много разных систем сборки и инструментов CI. Совсем недавно я столкнулся с иногда сложной задачей добавления в среду автоинструментов для приложения C++ разумного размера. Мне нравится простота использования для конечного пользователя, но я не очень люблю работать с m4 и всеми инструментами auto* со стороны разработчиков.

В свободное время я работаю над достаточно большим сайд-проектом и решил, что хочу взять CMake для тест-драйва. Поскольку я только начинаю, я, очевидно, планирую копаться в документации, FAQ, вики и т. Д. И учиться на практике. Кстати, я бы потратил деньги на книгу "Mastering CMake", но комментариев, которые я нашел на Amazon, было достаточно, чтобы я решил, что это, вероятно, не стоит денег. Все это, как говорится, в чем-то новом часто есть "ошибки", которые новичок будет часто спотыкаться о том, что старые профессионалы давно научились избегать. Мне интересно, что они основаны на опыте людей с CMake, и я надеюсь немного урезать свои учебные проблемы, задав здесь вопрос.

Я должен отметить, что я планирую собирать в первую очередь Linux и другие варианты UN*X. Windows на самом деле не касается моего POV. Это большое серверное приложение с веб-интерфейсом и интерфейсом командной строки для операторов, северным REST-интерфейсом для автоматизации / интеграции с инструментами OSS и южным SOAP-интерфейсом для CPE. Мне понадобится много сторонних библиотек и приложений, чтобы все это заработало, если я не хочу потратить следующие 10 лет, чтобы собрать все это вручную.:)

2 ответа

Решение

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

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

  2. Синтаксис: синтаксис может быть причудливым с множеством странных причуд, хотя он становится лучше, начиная с версий 2.6 и 2.8.

  3. Кеширование переменных. CMake отслеживает кэш переменных и настроек, и иногда это может быть проблемой при перестройке чего-либо. Попробуйте удалить CMakeCache.txt (или очистить каталог сборки вне источника) и пересобрать. Этот также упоминается DarenW.

  4. Поиск и настройка сторонних библиотек: если у вас большой проект, зависящий от нескольких библиотек (ваших или сторонних), это, вероятно, будет самым хлопотным.

    • Я настоятельно рекомендую погрузиться в команду find_package. Он очень мощный, но полностью зависит от качества файлов FindXXX.cmake. Особенно при сборке на нескольких платформах (в основном Windows и Mac), эти файлы могут потребовать некоторой настройки или вам может потребоваться написать свою собственную.

    • Проблемы со связыванием библиотек, такие как отладка "неопределенных ссылок" или несоответствия между debug|release или static|shared, могут быть трудными для отладки. Особенно со сторонними библиотеками эти проблемы могут быть вызваны неправильными сторонними файлами FindXXX.cmake...

Одна вещь, которая заняла у меня некоторое время, чтобы понять: если что-то пойдет не так со сборкой, потому что я изменил опцию компилятора, добавил / удалил файл.c, имел путаницу с версиями библиотеки поддержки и т. Д. - лучше всего удалить построить дерево и запустить CMake с нуля. В противном случае, хотя CMake и make кажется, делают свою работу, в результате исполняемый файл падает.

Может быть, мы "делаем это неправильно", но это становится общей проблемой для многих инструментов, языков, сред и т. Д. Не каждый может быть экспертом во всем программном обеспечении, от которого зависит, и "не делать этого". правильно "- это единственный способ сделать многое даже среди профессионалов. CMake довольно умен во многих вещах, но не во всех. Обнуление дерева сборки остается широко используемой техникой в ​​нашем проекте.

Другие вопросы по тегам