Windows, Mac ve Linux'ta güvenilir bir şekilde çalışan C uygulamaları, basit bir yapılandırma dosyasında ve sonra platforma özgü bir yapılandırma dosyasında tanımlamanıza izin vererek - her platformun yerli aracına adapte olan bir sistem oluşturmasını talep eder. CMake, açık kaynaklı bir sistem jeneratörü oluşturmak için, bu projeyi C projeleriyle basit bir yapılandırma dosyasında tanımlamanıza ve sonra platforma özgü bir şekilde inşa etmek (Makefiles, Visual Studio çözümü dosyaları, Xcode projeleri vs.).

CMake Nedir?

CMake bir meta-build sistemidir: doğrudan kod derlemez, ancak diğer inşa sistemleri için giriş dosyaları üretirsiniz. Projenizi size özgü bir dil kullanarak bildirirsiniz. CMake then reading this files and prints the appropriate build instructions for the target platform.

CMake'nin temel özellikleri şunlardır:

  • [FONT:0)Platform-agnostic sözdi: Aynı [[CPCT:1), Unix, Windows ve Mac.
  • [FONT:0) Çok sayıda jeneratör:[Dönetici:[Dönetici:[Dönenek: 1) Destekler Ninja, Visual Studio, Xcode ve diğerleri yapar.
  • [FONT:0)Out-of-source inşalar:) Keeps kaynak kodlarından ayrı eserler inşa eder.
  • [FONT:0)Extenability:[Dönetici:[Dönetici:[Dönetici:0)[[Dönetici:[Dönetici:[Dönetici: · 4 )
  • [FONT:0)Package keşif:[Dönetici:0)[FONT:2) yerleşik kütüphaneler ve başlıklar bulur.
  • [FONT:0) CI/CD ile Integration:) Otomatik boru hatlarında sorunsuz çalışır.

CMake, C ve C++ ekosisteminde çapraz platform gelişimi için de facto standart haline geldi, projeler tarafından LLVM, Natasha ve tüm KDE masaüstü ortamı olarak kullanıldı.

CMake for Cross-Platform C Development için kullanım Faydaları

CMake'yi kabul etmek basit portability'in ötesinde birkaç somut avantaj getiriyor:

  • [FONT:0) Tek bir gerçek kaynağı:[Dönem:[Dönem: 0) Bir kez mantık yaz ve her platform için dosyaları üretir, kırılgan kabuk senaryolarını veya platformu özel makyaj dosyalarını ortadan kaldırır.
  • [FONT:0]IDE entegrasyonu: [Döneticiler Visual Studio, CLion, Xcode, veya VS Kodlarında aynı [[Döneticileri paylaşabiliyorlar.
  • [FONT:0)Modular projesi yapısı:[Dönemli: 1) UseETHFLT:4) Büyük projeleri kendi bağımlılıklarıyla yönetilebilecek bileşenleri bölmek.
  • [FONT:0)Conditional mantık:[Dönemli bayraklar, kaynak dosyaları veya kütüphaneler yalnızca gerekli olduğunda, tüm konfigürasyonları karıştırmaksızın.
  • [FONT:0) Bağımlı bağımlılık:[Dönetici:[Dönetici: · 1/01/5) Üçüncü taraf kütüphaneleri kullanarak basitleştirilmiş.
  • [FONT:0)Test ve paketleme: [Dönetici: CTest ve CPack sıkı bir şekilde entegre edilir ve yüklemeleyicileri oluşturmak için önemsiz hale gelir.
  • [FONT:0)Yapı performansı:[DÜDÜDÜDÜDÜDÜ:0)Yapı performansı:[DÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜ)[ÜŞÜNÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜD
  • [FONT:0)Aktif topluluk:[Dönetici: · 1) ThoroughOUREN:2) Resmi belgeler[[Dönetici: 3) ve modüller ve öğreticilerin gelişen bir ekosistemi.

Başlayın: CMake for a C Project

Bu bölüm, üç büyük platformda derlenen bir executable için tam bir iş akışıyla yürür.

1. CMake

En son ikiliyi [[0)cmake.org) veya sisteminiz paketi yöneticisini kullanın:

  • [FONT:0)Linux (Debian/Ubuntu): ).
  • [Üye:0)macOS (Evbrew): ).
  • [FONT:0) Windows:[[Dönetici:0) Yüklemeyi çalıştırın ve “Sisteme Ekle CMake”nın seçilmesini sağlayın.

3.10 veya daha yüksek sürüm ile kurulumunu yapmak burada tartışılan özellikler için önerilir.

2. Minimal CMakeLists.txt

Proje kökünde bulunan bir dosya oluşturun. Aşağıda tek kaynak C projesi için en az örnek:

cmake_minimum_required(VERSION 3.10)
project(HelloWorld C)

add_executable(hello main.c)

Breakdown:

  • [[Dind:2|En az CMake versiyonunu ayarlar. Bu aynı zamanda davranışı geliştiren politika güncelleştirmeleri sağlar.
  • [[DÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ
  • [FONT: 16) CMake'ya hedefin UYARI'den inşa edilmesi gerektiğini söyler.

Biraz daha gerçekçi bir örnek, derleyici bayraklar ve bir üst düzey bağımlılık ekliyor:

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)

İşte bu, sadece www.c.c.com için bulunan ve bu konudaki en büyük hedeftir.

3. Genrate Build Files

Bir dizi dizi dizi oluşturun ve CMake'yu çalıştırın:

mkdir build
cd build
cmake ..

Linux /macOS'ta bu, Windows'da yüklü bir şekilde bir Makefile üretir, bir şekilde bir [[FONTD:23) dosyası oluşturur.Farklı bir jeneratör talep etmek için, kullanımDANFLT:24).

jenerasyondan sonra, yapılandırma zamanında seçenekler geçebilirsiniz:

cmake .. -DCMAKE_BUILD_TYPE=Release -DMY_FEATURE=ON

Bu değişkenler, sonraki işlemlerde yeniden kullanılabilir ve yeniden kullanılabilir.

4. Projeyi oluşturun

Bir kez dosyaları oluşturulur, der:

  • [FONT:0)Make/Ninja:[Döntilmiş: [Dönetici:0)[Döneticiler ve jeneratörler üzerinde çalışır)
  • [FONT=0)Visual Studio:[Dönetici:[Dönetici: {0]
  • [FONT:0)Xcode:[Dönem: {0}[Dönem: {0)

[FONT: 30) komut çapraz platformdur ve platforma özel çağrılardan kaçınır.UseAHFLT:31] inşa etmek için.

Gerçek Dünya Projeleri için Gelişmiş CMake Teknikleri

Temellerin ötesinde, CMake daha büyük veya daha karmaşık inşaları kolaylaştıran özellikler sunar. Mastering these will save time and reduce errors.

Find package ile bağımlılıkları yönetme

[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=0)))))) Kaynak: A.Ş.

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

İthalatlanmış hedefler otomatik olarak yönetmenler, derleme tanımları ve bağlantı bayrakları içerir.Eğer kütüphane CMake yapılandırılan dosyaları sağlamazsa, kendi veya topluluklarınıza güvenebilirsiniz.(0)cmake-de Developmenter).

Sistem çapında yükleme olmadan bağımlılıklar için, [[Dönüşükümler için, [[Dönüşükümler için, [[Çevksiz yüklemeler ve kaynak kodlarını yapılandırın:

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)

Bu yaklaşım belirli versiyonları pinning ile yenidenroducible builds sağlar.

CTests ile Testler

CMake CTest aracılığıyla testleri entegre eder ve testlerinizi tanımlayabilirsiniz.Enable it and define tests in yourİLFLT:36).

enable_testing()

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

add_test(NAME ParserTest COMMAND test_parser)

Testleri ile çalıştırın:

ctest --output-on-failure

CTest test fikstürlerini, etiketleri, zamanlarını ve paralel infazı destekler. Daha kapsamlı bir test için, [[DDDDD:0)cmocka) kütüphanesine bağlanmak ve kullanım yoluyla [[Döneticileri" ile bir araya getirmeyi düşünün.

Cross-Compilation

CMake, sroot ve hedef mimarisi ile bir dosya oluşturun:0)toolchain dosyaları[DK:1). Bir aletchain dosyası derleyici, sysroot ve hedef mimarisi ayarlar.Create a file likeENFLT:40:

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

Sonra CMake with the carchain:

cmake -DCMAKE_TOOLCHAIN_FILE=arm-cross.cmake ..

CMake otomatik olarak belirtilen haçları kullanacak ve kütüphaneler için tabanları arayacaktır. Bu teknik gömülü sistemler, mobil platformlar ve inşa makinesinin hedef makineden farklı olduğu senaryo için çalışır.Reer to the officialETHFLT:0Cross Compiling with CMake).

Yükleme ve Ambalajlama

Kullanım: ⁇ : ⁇ : ⁇ : ⁇ : ⁇ : ⁇ :

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

CPack daha sonra yükleme yapanları üretir: DEB, RPM, NSIS, DMG, vs. Ekle at the end of yourİLFLT:45).

include(CPack)

RunFLT:47, bir Debian paketi üretmek için. CPack tüm yükleme kurallarına sahiptir ve ESFLT:48 gibi değişkenlere izin verir.

Ortak Pitfalls ve En İyi Uygulamaları

Deneyimli geliştiriciler bile horags vurdu. İşte sık sık sorunlar ve onlardan nasıl kaçınılması:

Pitfall: Sertleştirici Yollar

Kaynak ağacı ile ilgili olarak, yollara veya yükleme müdürlerine güvenmek için mutlak yollar asla kullanmayın.

Pitfall: Jeneratör Expressions

Jeneratör ifadeleri ([[DÜŞME KAYNAK KAYNAK KAYNAK KAYNAK KAYNAK KAYNAKLARI) zaman inşa etmeyi değerlendirme, yapılandırılmadı. per-konasyon ayarları için gereklidir:

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

Bu, Debug için sadece Debug için geçerlidir. (Çevirli Stüdyo, Xcode) çok yapılandırılmış jeneratörler (Visual Studio, Xcode) yapılandırılamaz.

Pitfall: Küresel Komutları Aşırı Kullanın

Komutanlar, Âdem'in, Âdem'in, Âdem'in, Âdem'in, Âdem'in, Âdem'in, Âdem'in, ́in, Âdem'in, ́in, ́in, sûrenin, sûrenin, sûrenin, sûrenin, sûrenin, sûrenin, sûrenin, sûrenin, sûrenin, sûrenin, sûrenin, sûrenin,

Pitfall: Find package için Proper Scope kullanmıyor

SetFLT:64. kapsamı uygun şekilde. Modern CMake ile, ESFLT:65'i tercih edin ve sonra hedeflerini bağlantıya almayın.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

CMake, çok platform C gelişiminin bir yönetilebilir, tekrarlanabilir bir süreç haline getirilmesini sağlar.Bir tek bir set inşa talimatları yazarak, yerel performansı kazanır, IDE desteği ve tüm büyük işletim sistemlerinde sağlam bağımlılık yönetimi kazanır. Basit bir şekilde gelişmiş özelliklerle başlayın - test etmek, çapraz-kompilasyon, paketleme - Projeniz büyür.