Membina aplikasi C yang mengkompilasi dan menjalankan secara layak di seluruh Windows, macOS, dan Linux memerlukan lebih dari kode sumber portabel ⁇ ia menuntut sistem build yang menyesuaikan dengan alatan asli masing-masing platform. CMake, sebuah generator sistem build open-source, menyelesaikan hal ini dengan membiarkan anda mendefinisikan proyek anda sekali dalam berkas konfigurasi sederhana dan kemudian memproduksi berkas building spesifik platform (Makefiles, berkas solusi Visual Studio, proyek Xcode, dll.). Artikel ini menyediakan panduan yang menyeluruh, praktis untuk membuat sistem build cross-platform untuk CMake, meliputi segala sesuatu dari teknik dasar yang diselaraskan ke ketergantungan, pengujian, dan pe-pilasi.

Apa Itu CMake?

Anda menjelaskan proyek Anda dalam berkas menggunakan bahasa spesifik domain. CMake kemudian membaca berkas ini dan mengeluarkan instruksi build yang sesuai untuk platform target.

Karakteristik kunci CMake termasuk:

  • [[GANDAFLT:0]]Platform-agnognostic sintaksis:] Yang sama [ bekerja pada Unix, Windows, dan macOS.
  • [[CharlieFLT:0]]Generator ganda: Mendukung Make, Ninja, Visual Studio, Xcode, dan lain-lain.
  • [[CALT:0]]Out-of-source builds: Menjaga pembuatan artefak terpisah dari kode sumber.
  • [[Chathasias FLT:0]]Extensibility: Modul, fungsi, dan makro memungkinkan logika build yang dapat digunakan kembali.
  • [[Efleksi toolsexpand:[[FLT:]]]Package recovery:] locates installed library and headers.
  • [[ZOGAL:0]]Integrasi dengan CI/CD: Bekerja tanpa hasil dalam pipa otomatis.

LADI CMake telah menjadi standar de facto untuk pengembangan lintas platform dalam ekosistem C dan C++, yang digunakan oleh proyek-proyek seberbagai LLVM, MySQL, dan seluruh lingkungan desktop KDE.

Manfaat Menggunakan CMake untuk Pembangunan C Lintas-Platform

Adoping CMake membawa beberapa keuntungan konkret di luar kemampuan port yang sederhana:

  • [[CharlesfLT:0]] Sumber kebenaran tunggal: Tulis membangun logika sekali dan hasilkan berkas untuk setiap platform, menghilangkan skrip shell rapuh atau platform-spesifik Makefiles.
  • [[ZOBILT:0]]IDE integrasi: Teams dapat bekerja di Visual Studio, Clion, Xcode, atau VS Code saat berbagi yang sama.
  • [[ENOBLEFLT:0]]Modul struktur proyek: Gunakan untuk membagi proyek besar menjadi komponen yang dapat dikelola dengan dependensi mereka sendiri.
  • [[CharlesFLT:0]]Kondisional logika: Laksana bendera-bendera spesifik-perform, berkas sumber, atau perpustakaan hanya bila diperlukan, tanpa menduplikasi seluruh konfigurasi.
  • [[GANFAILT:0]] Pengendalian ketergantungan otomatis: dan Sederhanakan menggunakan pustaka pihak-tiga.
  • [[ZOBALT:0]]Pengujian dan pengepakan: CTest dan CPack terintegrasi erat, membuatnya sepele untuk menambahkan tes dan membuat pemasang.
  • [[GOLLAFT:0]]Bina kinerja: Penabur Ninja dikombinasikan dengan CCache mengurangi pembangunan ulang kali secara dramatis.
  • [ZonazoneFLT:0]] Komunitas aktif: Thorough Dokumentasi resmi dan ekosistem modul dan tutorial yang berkembang pesat.

Starting Getting Starting: Setup CMake untuk sebuah C Project

Bagian ini berjalan melalui alur kerja lengkap dari instalasi ke sebuah executable terkompilasi pada tiga platform utama.

1. Pasang CMake

unduhan unduhan binari terbaru dari cmake.org atau gunakan manajer paket sistem anda:

  • [[CharfsFLT:0]]Linux (Debian/Ubuntu):
  • macOS (Homebrew):
  • [[EflethingFLT:0]]Windows: Jalankan pemasang dan pastikan \"Tambahkan CMake ke PATH sistem\" dipilih.

Pemasangan verifikasi wick dengan . Versi 3.10 atau lebih tinggi disarankan untuk fitur-fitur yang dibahas di sini.

2. Tulis Minimal CMakeLists.txt

FOBLE membuat berkas bernama pada akar projek anda. Di bawah ini adalah contoh minimal untuk proyek C sumber-tunggal:

cmake_minimum_required(VERSION 3.10)
project(HelloWorld C)

add_executable(hello main.c)

Breakdown:

  • [[Efolski:12]] menetapkan versi minimum CMake. Ini juga memungkinkan pembaruan kebijakan yang memperbaiki perilaku.
  • [[GANDAFLT:13]] mendefinisikan nama dan bahasa proyek. Menyatakan mencegah CMake dari pemindaian untuk kompiler C++.
  • memberitahu CMake bahwa target seharusnya dibangun dari .

Contoh yang sedikit lebih realistis menambahkan bendera kompiler dan dependensi header-only:

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)

BAHASA Here menambahkan ke jalur pencarian kepala kompiler hanya untuk target .

GMNO 3. Hasilkan Berkas Binaan

Buat direktori dan jalankan CMake:

mkdir build
cd build
cmake ..

Diagnobia pada Linux/macOS ini menghasilkan Makefile secara default. Pada Windows dengan Visual Studio terpasang, ia menghasilkan berkas . Untuk meminta generator yang berbeda, gunakan .

Setelah generasi, Anda dapat lulus pilihan pada waktu konfigurasi:

cmake .. -DCMAKE_BUILD_TYPE=Release -DMY_FEATURE=ON

Variabel ini disimpan dalam dan digunakan kembali pada run selanjutnya.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Setelah berkas pembangunan dihasilkan, kompile:

  • Make/Ninja: (bekerja di semua platform dan generator)
  • Visual Studio:
  • Xcode:

Perintah adalah cross-platform dan menghindari invokasi platform-spesifik. Gunakan untuk mempercepat pembangunan.

Teknik CMake Lanjutan untuk Proyek Dunia Real

Di luar dasar, CMake menawarkan fitur yang lebih besar atau lebih kompleks membangun alur sungai.

Memanenkan Ketergantungan dengan find package

Parameter perintah mencari pustaka yang dipasang dan menetapkan variabel untuk mereka memasukkan jalur dan berkas pustaka. CMake modern mendorong menggunakan diimpor target untuk propagasi ketergantungan bersih:

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

Target yang diimpor secara otomatis membawa direktori, definisi kompil, dan tanda link. Jika perpustakaan tidak menyediakan berkas konfigurasi CMake, Anda mungkin memerlukan modul Cari. Tulis sendiri atau bergantung pada komunitas di cmake-developer.

Untuk dependensi tanpa instalasi sistem-lebar, download dan mengintegrasikan kode sumber pada saat konfigurasi:

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)

Pendekatan ini memastikan pembangunan yang dapat diperbaiki dengan menjepit versi tertentu.

Uji Penambahan dengan CTest

Buat CMake mengintegrasikan pengujian melalui CTest. Aktifkan dan takrifkan tes dalam :

enable_testing()

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

add_test(NAME ParserTest COMMAND test_parser)

Uji coba uji coba dengan:

ctest --output-on-failure

Uji-CTest mendukung fixture tes, label, timeout, dan eksekusi paralel.Untuk pengujian yang lebih komprehensif, pertimbangkan penggabungan dengan kerangka kerja uji-satuan seperti cmocka dengan menghubungkan perpustakaannya dan menggunakan .

Kompilasi-Silang

¡CMake simplifikasi cross-compilation melalui toolchain files. Sebuah berkas toolchain menetapkan kompilator, sysroot, dan arsitektur target. Membuat berkas seperti :

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

Kemudian panggil CMake dengan toolchain:

cmake -DCMAKE_TOOLCHAIN_FILE=arm-cross.cmake ..

¡CMake akan secara otomatis menggunakan cross-compiler yang dinyatakan dan mencari sysroot untuk perpustakaan. Teknik ini bekerja untuk sistem tertanam, platform mobile, dan skenario apapun di mana mesin build berbeda dengan mesin target. Refer ke situs resmi Cross Compiling dengan CMake] guide untuk rincian.

Peminstalan dan Pemiapan

Use perintah untuk mendefinisikan bagaimana proyek Anda harus dikerahkan:

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

Keandies CPack kemudian menghasilkan pemasang: DEB, RPM, NSIS, DMG, dll Tambahkan di akhir Anda:

include(CPack)

¡Calke Run untuk menghasilkan paket Debian. CPack mewarisi semua aturan pemasangan dan mengizinkan kustomisasi melalui variabel seperti .

Air Terjun Biasa dan Praktek Terbaik

Pengembang yang berpengalaman pun pernah mengalami gangguan.

Pitfall Kecelakaan: Jalan - Jalan Sulit Menyahkod

Jangan sekali-kali wanfan menggunakan jalur absolut dalam . Gunakan dan relatif terhadap pohon sumber. Untuk lokasi berkas runtime, gunakan untuk menembatkan jalur atau mengandalkan direktori instalasi.

Air Terjun ungkap: Mengabaikan Ekspresi Penjana

Ekspresi generator evaluasi () pada waktu build, bukan waktu konfigurasi. Mereka sangat penting untuk pengaturan per-konfigurasi:

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

Ini tidak akan menambahkan hanya untuk build debug. Hindari menggunakan karena generator multi-konfig (Visual Studio, Xcode) tidak menetapkan pada saat konfigurasi.

Kesusahan: Perintah Global yang Menderita

Perintah-perintah somepance seperti , , dan mempengaruhi semua target. Lebih suka perintah-perintah spesifik target seperti , , dan untuk enkapsulasi yang lebih baik.

Pitfall: Tidak menggunakan Skop yang Cocok untuk find package

Takson Set skop tepat. Dengan CMake modern, lebih suka dan kemudian hubungkan targetnya. Jangan gunakan dan set link direktori secara manual kecuali benar-benar diperlukan.

Kekecualian Kesimpulan

CMake mengubah tantangan pengembangan multi-platform C menjadi proses yang dapat diatur, dapat diulangi. Dengan menulis satu set instruksi membangun, Anda mendapatkan kinerja asli, dukungan IDE, dan manajemen ketergantungan yang kuat di seluruh sistem operasi utama. Mulai dengan sederhana dan secara bertahap mengadopsi fitur canggih ⁇ ujian, pemuatan silang, pengemasan ⁇ seperti proyek Anda tumbuh. Investasi dalam belajar CMake membayar kembali setiap kali Anda membangun, menguji, atau menyebarkan pada platform yang berbeda tanpa menulis ulang satu baris kode build.