Rakennus C-sovellukset, jotka kokoavat ja toimivat luotettavasti läpi Windows, MacOS, ja Linux vaativat enemmän kuin kannettava lähdekoodi.Se vaatii rakentaa järjestelmän, joka mukautuu kunkin alustan natiivi työkalut. CMAke, avoimen lähdekoodin rakennusjärjestelmä generaattori, ratkaisee tämän antamalla sinun määritellä projektin kerran yksinkertainen konfiguraatiotiedosto ja sitten tuottaa alustakohtaisia rakennustiedostoja (Makefiles, Visual Studio ratkaisu tiedostot, Xcode projektit jne.). Tämä artikkeli tarjoaa perusteellisen, käytännön opas luoda cross-platform rakennusjärjestelmä C-projekteille CMake, joka kattaa kaiken perusasetuksista kehittyneisiin tekniikoihin, kuten riippuvuushallinta, testaus, ja ristikkäiskomplilisaatio.

Mikä on CMake?

CMAke on meta-build-järjestelmä: se ei kokoa koodia suoraan vaan tuottaa syötetiedostoja muille rakennusjärjestelmille. Kuvaat projektiasi [-tiedostoissa verkkotunnuskohtaisen kielen avulla. CMAke lukee sitten nämä tiedostot ja tuotokset sopivat rakennusohjeet kohdealustalle.

CMAKen keskeisiä ominaisuuksia ovat:

  • Platform-agnostinen syntaksi:[ Sama toimii Unix, Windows ja MacOS.
  • Monipuoliset generaattorit:[ Tukee Make, Ninja, Visual Studio, Xcode, ja muut.
  • Out-of-source building: pitää esineet erillään lähdekoodista.
  • Laajennettavuus:[ Moduulit, toiminnot ja makrot mahdollistavat uudelleenkäytettävän rakennuslogiikan.
  • Pakkauslöytö: [ paikantaa asennetut kirjastot ja otsikot.
  • Integraatio CI/CD:n kanssa:[ Toimii saumattomasti automaattisissa putkistoissa.

CMAkesta on tullut C- ja C++-ekosysteemin cross-platform-kehityksen todellinen standardi, jota käyttävät niinkin erilaiset hankkeet kuin LLVM, MySQL ja koko KDE-työpöytäympäristö.

Edut CMAke C C:n C-ristinmallin kehittämiseen

Cmake-ohjelman käyttöönotto tuo useita konkreettisia etuja, jotka ylittävät yksinkertaisen siirrettävyyden:

  • Yksi totuuden lähde:[ Kirjoita rakenne logiikka kerran ja luo tiedostoja jokaiselle alustalle, poistaen hauraita kuoriskriptejä tai alustakohtaisia Makefile-tiedostoja.
  • IDE-integrointi:[ Joukkueet voivat työskennellä Visual Studiossa, CLionissa, Xcodessa tai VS-koodissa samalla .
  • Modulaarinen hankerakenne:[ Käytä ] jakaaksesi suuret hankkeet hallittaviin osiin, joilla on omat riippuvuutensa.
  • Ehdollinen logiikka:[ Käytä alustakohtaisia lippuja, lähdetiedostoja tai kirjastoja vain tarvittaessa päällekkäisesti kokonaisia konfiguraatioita.
  • Automatisoitu huolto: ja yksinkertaistavat kolmansien osapuolten kirjastojen käyttöä.
  • Testit ja pakkaukset:[ CTest ja CPack ovat tiiviisti integroituja, joten on merkityksetöntä lisätä testejä ja luoda asentajia.
  • Rakenna suorituskyky:[ Ninja generaattori yhdistettynä CCache vähentää jälleenrakentamisen aikoja dramaattisesti.
  • Aktiivinen yhteisö: [ perusteellisesti viralliset asiakirjat[] ja kukoistava ekosysteemi moduuleista ja opetusohjelmista.

Aloittaminen: C-projektin CMAke-asetuksen laatiminen

Tämä osio kulkee läpi koko työnkulun asennuksesta koottuun suoritustiedostoon kolmella suurella alustalla.

1. Asenna CMake

Lataa uusin binääri cmake.org:sta tai käytä järjestelmäsi pakettihallintaa:

  • Linux (Debian/Ubuntu):
  • makos (kotimainen):
  • Ikkunat:[ Suorita asentaja ja varmista ...Lisää CMAKE järjestelmään PATH.

Varmista asennus . Versio 3.10 tai uudempi suositellaan tässä käsitellyille ominaisuuksille.

2. Kirjoita minimaalinen CMakeLists.txt

Luo projektin juuriin tiedosto [. Alla on pienin esimerkki yhden lähdekoodin C-projektista:

cmake_minimum_required(VERSION 3.10)
project(HelloWorld C)

add_executable(hello main.c)

Jako:

  • asettaa minimin CMAke-version. Tämä mahdollistaa myös käyttäytymisen parantamiseen tähtäävät politiikan päivitykset.
  • määrittelee projektin nimen ja kielen. Määrittely estää CMAkea skannaamasta C++-kääntäjiä.
  • kertoo CMAkelle, että kohde on rakennettava .

Hieman realistisempi esimerkki lisää kääntäjän liput ja vain otsikon riippuvuus:

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)

Tässä lisätään kääntäjän hakupolkuun vain kohteen osalta.

3. Luo tiedostoja

Luo rakennushakemisto ja suorita CMake:

mkdir build
cd build
cmake ..

Linux/macOS-järjestelmässä tämä tuottaa oletuksena Makefile-tiedoston. Windowsissa, jossa on Visual Studio asennettuna, se tuottaa -tiedoston. Voit pyytää eri generaattoria, käytä .

Sukupolven jälkeen voit siirtää valinnat konfiguraatioaikaan:

cmake .. -DCMAKE_BUILD_TYPE=Release -DMY_FEATURE=ON

Nämä muuttujat säilytetään ja niitä käytetään uudelleen myöhemmillä ajoilla.

4. Rakenna projekti

Kun tiedostoja on luotu, kokoa:

  • Make/Ninja: [ [ (toimii kaikilla alustoilla ja generaattoreilla)
  • Visual Studio: ]
  • Xkoodi: [ ]]

komento on cross-platform ja välttää alustakohtaisia kutsumuksia. Käytä nopeuttamaan rakennustöitä.

Kehittyneet CMAke-tekniikat reaalimaailman hankkeissa

Perusteiden lisäksi CMake tarjoaa ominaisuuksia, jotka virtaviivaistavat suurempia tai monimutkaisempia rakennelmia. Näiden hallinta säästää aikaa ja vähentää virheitä.

Riippuvuusasioiden hallinta find packagella

komento paikantaa asennetut kirjastot ja asettaa muuttujat niiden polkuja ja kirjastotiedostoja varten. Moderni CMake kannustaa käyttämään tuotuja kohteita[ puhtaan huoltosuhteen lisäämisessä:

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

Tuodut kohteet kantavat automaattisesti hakemistoja, kokoavat määritelmät ja linkittävät liput. Jos kirjasto ei tarjoa CMAke config-tiedostoja, voit tarvita Etsi-moduulin. Kirjoita oma tai luota yhteisöllisiin kohteisiin osoitteessa cmake-developer[.

Riippuvuussuhteita varten ilman järjestelmän laajuista asennusta lataa ja integroida lähdekoodin konfiguraatioaikaan:

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)

Tämä lähestymistapa varmistaa toistettavissa olevat rakennelmat laittamalla tietyt versiot.

Lisääminen testit CTest

Cmake yhdistää testauksen CTest-testin avulla. Ota se käyttöön ja määrittele testit :

enable_testing()

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

add_test(NAME ParserTest COMMAND test_parser)

Suorita testit:

ctest --output-on-failure

CTest tukee testikalusteita, tarroja, aikakatkaisua ja rinnakkaista suoritusta. Kattavampaa testausta varten kannattaa harkita yhdistämistä yksikkötestikehykseen, kuten cmocka[], liittämällä sen kirjasto ja käyttämällä [].

Ristikkäispakkaus

CMAke yksinkertaistaa cross-komplifiointia []työkaluketjutiedostojen kautta[. Työkaluketjutiedosto asettaa kääntäjän, sygrootin ja kohdearkkitehtuurin. Luo tiedosto, kuten :

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

Sitten vedota CMAke työkaluketju:

cmake -DCMAKE_TOOLCHAIN_FILE=arm-cross.cmake ..

Cmake käyttää automaattisesti määriteltyä ristikompperia ja etsii kirjastojen sygroot-kompetenssia. Tämä tekniikka toimii sulautettuihin järjestelmiin, mobiilialustoihin ja kaikkiin tilanteisiin, joissa rakennuskone eroaa kohdekoneesta. Katso virkailija Cross Compling with CMake[ -oppaasta.

Asentaminen ja pakkaus

Käytä komentoja määritelläksesi, miten projektisi on tarkoitus ottaa käyttöön:

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

CPack tuottaa asentajia: DEB, RPM, NSIS, DMG jne. Lisää loppuun:

include(CPack)

Suorita tuottaaksesi Debian-paketin. CPack perii kaikki asennussäännöt ja mahdollistaa räätälöinnin esimerkiksi .

Yhteiset onnettomuudet ja parhaat käytännöt

Jopa kokeneita kehittäjiä osuma snags. Tässä ovat usein kysymyksiä ja miten välttää niitä:

Pitfall: Hardcoding-polut

Älä koskaan käytä absoluuttisia polkuja . Käytä ja lähdepuuhun nähden. Runtime-tiedostojen sijaintiin käytetään polkuja tai luotetaan asennushakemistoihin.

Pitfall: Ei huomioi generaattorin lauseita

Generaattorin ilmaukset () arvioivat rakennusajan eikä määritä aikaa. Ne ovat välttämättömiä konfigurointia varten:

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

Tämä lisää vain Debug-rakennukset. Vältä :n käyttöä, koska monikonfiguraattorit (Visual Studio, Xcode) eivät aseta :a konfiguraatioaikaan.

Piti ohittaa maailmanlaajuiset komennot

, ja vaikuttavat kaikkiin kohteisiin. Mieluummin kohdekohtaiset komennot, kuten , ja , jotta ne olisivat paremmin kapseloituja.

Pitfall: Ei käytä oikeaa soveltamisalaa etsi paketissa

Aseta skape asianmukaisesti. Nykyaikaisen CMAke, suosi ja sitten linkitä sen tavoitteet. Älä käytä ja manuaalisesti asettaa linkkihakemistot, ellei aivan välttämätöntä.

Päätelmät

CMAke muuttaa monialustaisen C-kehityksen haasteeksi hallittavissa olevaksi, toistettavaksi prosessiksi. Kirjoittamalla yhden rakennusohjesarjan, saat syntyperäisen suorituskyvyn, IDE-tuen ja vankan riippuvuushallinnan kaikissa suurissa käyttöjärjestelmissä. Aloita yksinkertaisella ja ota vähitellen käyttöön edistyneitä ominaisuuksia.