Будівельні додатки C, які відповідають і працюють надійно через Windows, macOS, і Linux вимагає більш ніж портативний вихідний код - він вимагає системи побудови, яка адаптується до рідного інструменту кожної платформи. CMake, генератор системи відкритого джерела, вирішує це, дозволяючи ви визначити свій проект один раз в простий файл конфігурації, а потім виробляючи платформу-специфічні збірки файлів (Makefiles, Visual Studio рішень файлів, Xcode проектів і т.д.). Ця стаття забезпечує ретельний, практичний посібник для створення системи побудови кросплатформних систем для проектів C з CMake, охоплюють все з базової настройки для передових технологій, таких як управління залежностей, тестування та крос-компіляція.

Що таке CMake?

CMake - це система мета-будівельної роботи: вона не компілює код безпосередньо, але створює вхідні файли для інших систем побудови. Ви описуєте ваш проект в файли з використанням доменної мови. CMake потім читає ці файли і виводить відповідні інструкції з побудови для цільової платформи.

Ключові характеристики CMake включають:

  • Platform-agnostic синтаксис: працює на Unix, Windows, macOS.
  • Multiple генератори: Підтримка макіяжу, Ніндзя, Visual Studio, Xcode та інші.
  • Out-of-source build: Тримає створення артефактів, відокремлених від початкового коду.
  • Extensibility: Модульи, функції та макроси дозволяють багаторазово будувати логіку.
  • ] ] ] ]] ]] ] ] ]] ]]] ]]] ]] ]]]] [[FLT:]]] [[FLT:]]]]] [[FLT:]]]]]]]] [[FLT:[FLT:[FLT:]]]]]]]]]] [[FLT:]]]]]]]]] [[FLT:[FLT:]]]]]]]]]]]]]]] [[FLT:[FLT:]]]]] [[
  • Інтеграція з CI/CD: працює безшовно в автоматизованих трубопроводах.

CMake стала дефолтомним стандартом для розвитку кросплатформ в екосистемі C та C++, що використовується проектами як різноманітні як LLVM, MySQL, так і для всього робочого середовища KDE.

Переваги використання CMake для розвитку крос-платформи C

Прийняти CMake приносить кілька переваг бетону за простою переносимістю:

  • Single джерело правди: Напишіть логіку раз і генеруйте файли для кожної платформи, усунувши сценарії фрагми оболонки або платформи-специфічні файли.
  • IDE інтеграції: Команди можуть працювати в Visual Studio, CLion, Xcode або VS Code, а також обмінюватися тим же .
  • Modular project Structure: для розщеплення великих проектів на керовані компоненти з власними залежностями.
  • Кондиційна логіка: Застосовувати специфічні прапори, вихідні файли або бібліотеки лише при необхідності, не відкидаючи всю конфігурацію.
  • Автоматизоване управління залежностей: і спрощує використання сторонніх бібліотек.
  • Testing and Packaging: CTest and CPack щільно інтегровані, що робить його trivial для додавання тестів і створення інсталяторів.
  • Будь ласкаво просимо! Ninja генератор, поєднаний з CCache, значно скорочує час перебудови.
  • Активна спільнота: Thorough ]Офіційна документація та динамічна екосистема модулів та підручників.

Початок: Налаштування CMake для проекту C

Цей розділ проходив через повне робоче процес з установки до складеного виконуваних на трьох основних платформах.

1. Встановити CMake

Завантажте останні бінарні з cmake.org або скористайтеся менеджером пакету вашої системи:

  • macOS (Домашній):
  • Windows: Запуск інсталятора і забезпечення "Додати змії до системи PATH" вибрано.

Перевірити установку . Версія 3.10 або вище рекомендується для обговорення тут функцій.

2. Написати Мінімальну CMakeLists.txt

Створіть файл у вашому проекті корінь. Нижче наведено мінімальний приклад для проекту єдиного джерела C:

cmake_minimum_required(VERSION 3.10)
project(HelloWorld C)

add_executable(hello main.c)

Відхилення:

  • встановлює мінімальну версію програми. Це також дозволяє оновлення політики, які покращують поведінку.
  • визначає назву проекту та мову. Вказуючи ] запобігає CMake від сканування компіляторів C++.
  • розповідає про те, що ціль повинні бути побудовані з .

Невеликий більш реалістичний приклад додає прапори компілятора і заголовок-на-тільки залежностей:

cmake_minimum_required(VERSION 3.15)
project(Calculator C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)

add_executable(calc main.c parser.c)
target_include_directories(calc PRIVATE include)

додає до розділу пошуку головного редактора компілятора тільки для цілей .

3. Генерувати Створіть файли

Створіть каталог збірки та запустіть CMake:

mkdir build
cd build
cmake ..

На Linux / macOS це виробляє файл за замовчуванням. На Windows з встановленою Visual Studio вона генерує файл . Для запиту іншого генератора використовуйте .

Після закінчення покоління можна перенести параметри настроювання часу:

cmake .. -DCMAKE_BUILD_TYPE=Release -DMY_FEATURE=ON

Ці змінні зберігаються в і перевикористовуються на наступних ходу.

4. Побудувати проект

Після створення файлів, компіляція:

  • Make/Ninja: (працює на всіх платформах і генераторах)
  • Відеостудія: ]
  • Xcode: ]

команди перехресного майданчика і не дозволяє особливого рівнянь платформи. Використовуйте для прискорення будівель.

Сучасні технології CMake для проектів реального світу

За межами основ, CMake пропонує функції, які потокові більші або більш складні конструкції. Майстерність цих заощаджує час і зменшить помилки.

Управління залежностей з пошуком пакування

командних знахідок встановлених бібліотек і наборів змінних для їх включення до шляхів і бібліотекних файлів. Сучасні CMake заохочує використання імпортовані цілі для очищення поширення залежностей:

find_package(SDL2 REQUIRED)
target_link_libraries(my_app PRIVATE SDL2::SDL2)

Імпортні цілі автоматично виконуються: каталоги, визначення компіляції та прапори посилань. Якщо бібліотека не забезпечує файли конфігурацій CMake, вам може знадобитися модуль пошуку. Напишіть свій власний або спирайтесь на спільноти cmake-developer.

Для залежностей без встановлення системи завантажує та інтегрує вихідний код настройку часу:

include(FetchContent)
FetchContent_Declare(
 zlib
 GIT_REPOSITORY https://github.com/madler/zlib.git
 GIT_TAG v1.3
)
FetchContent_MakeAvailable(zlib)
target_link_libraries(my_app PRIVATE zlib)

Цей підхід забезпечує відтворювальні конструкції за допомогою пінінгових конкретних версій.

Додавання тестів з КТест

CMake інтегрує тестування через CTest. Увімкніть його та визначте тести у вашій :

enable_testing()

add_executable(test_parser test_parser.c)
target_link_libraries(test_parser PRIVATE parser_lib)

add_test(NAME ParserTest COMMAND test_parser)

Тести з:

ctest --output-on-failure

CTest підтримує тестові світильники, етикетки, часовий час та паралельне виконання. Для більш повного тестування врахуйте поєднувальну з блок-тестовою рамкою, такими як cmocka, за посиланням на бібліотеку та за допомогою .

Перетин

CMake спрощує перехресне навчання через toolchain files]. Файл інструментів набирає компілятор, сисроот і цільова архітектура. Створюємо файл, як :

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_SYSROOT /path/to/sysroot)

Потім зануріть CMake з інструментальноюгою:

cmake -DCMAKE_TOOLCHAIN_FILE=arm-cross.cmake ..

CMake автоматично використовувати вказаний крос-компілер і шукати sysroot для бібліотек. Ця техніка працює для вбудованих систем, мобільних платформ і будь-якого сценарію, де машина для побудови відрізняється від цільової машини. Refer to the офіційна Cross Compiling with CMake].

Встановлення та упаковка

Використовуйте команди, щоб визначити, як ваш проект повинен бути розгорнутий:

install(TARGETS my_app DESTINATION bin)
install(FILES config.ini DESTINATION etc)

CPack потім генерує інсталятори: DEB, RPM, NSIS, DMG і т.д. Додати в кінці :

include(CPack)

] для виробництва Debian пакета. CPack спадкоємець всі правила установки і дозволяє налаштувати за допомогою змінних, таких як .

Загальні положення та кращі практики

Учні, які випробували, що вони вражають, і як їх уникнути:

Pitfall: Важко стежки

Не використовуйте абсолютні шляхи . Використовуйте і відносно джерела дерева. Для локації файлу, скористайтеся для складання шляхів або спираючись на каталоги установки.

Pitfall: Ігноруючі експресії генератора

Висловлення генератора () оцінюється в часі збірки, не налаштовує час. Вони необхідні для налаштування конфігурації per-configuration:

target_compile_definitions(my_app PRIVATE
 $<$<CONFIG:Debug>:_DEBUG>
)

Цей додаток ] тому що багатоконфігураційні генератори (Visual Studio, Xcode) не встановлюють в налаштування часу.

Pitfall: Повершення глобальних команд

Команди, такі як , , і , впливають на всі цілі. Дофера цільових команд, таких як , , і для кращого захоплення.

Pitfall: Не використовуючи Proper Scope для пошуку package

Набір відповідно до обсягу. З сучасним CMake воліє і потім за посиланням його цілі. Не використовуйте і вручну задати посилання каталоги, якщо абсолютно необхідно.

Висновок

CMake трансформує виклик багатоплатформного розвитку C в керований, повторюваний процес. Списаючи єдиний набір інструкцій з побудови, ви отримуєте рідну продуктивність, підтримку IDE і надійний управління залежностей по всіх основних операційних системах. Почати з простою і поступово приймати розширені функції—перевірка, крос-компіляція, упаковка—як ваш проект росте. Інвестиції в навчання CMake окупається кожен раз, коли ви будуєте, тест або розгортати на іншій платформі без перезапису єдиний рядок коду збірки.