Qt-ohjelmointi
make, CMake ja qmake
Make-työkalu C/C++-ohjelmoinnissa

make on työkalu, jota käytetään ohjelmistokehityksessä erityisesti C- ja C++-projektien kokoamiseen. Se helpottaa projektien hallintaa ja automatisoi käännösprosessin.

CMake ja qmake ovat build-järjestelmien generaattoreita, jotka voivat käyttää makea tai muita työkaluja taustalla.

CMake
  1. CMake on meta-build-järjestelmä, eli se generoi Makefilet (tai muita projektitiedostoja) puolestasi
  2. CMake käyttää tiedostoa nimeltä CMakeLists.txt, joka kuvaa projektin rakenteen korkeammalla abstraktiotasolla
qmake
  1. qmake on Qt-kehykseen liittyvä build-työkalu
  2. Suunniteltu erityisesti Qt-sovellusten rakentamiseen
  3. Lukee .pro-tiedoston ja luo Makefilen tai muuta vastaavaa
Mikä on Makefile?

Makefile on tekstitiedosto, joka kertoo make-työkalulle, miten projekti pitää kääntää. Siinä määritellään riippuvuudet, käännöskomennot ja säännöt, jotka kertovat mitä pitää tehdä, kun tiedosto muuttuu.

Perusrakenne

target: dependencies
    command
    

Jokainen sääntö koostuu kohteesta (target), sen riippuvuuksista (dependencies) ja komennosta, joka suoritetaan. Tärkeää: komennon edessä täytyy olla TAB-merkki.

Esimerkki Makefile:stä

Seuraavassa esimerkissä käännetään yksinkertainen C++-projekti, jossa on kolme tiedostoa: main.cpp , utils.cpp ja utils.h.

Ja tässä mainittujen koodi-tiedostojen sisällöt
//main.cpp
#include <iostream>
#include "utils.h"

int main() {
    std::cout << "Tulos: " << kerroKahdella(5) << std::endl;
    return 0;
}
//utils.h 
#ifndef UTILS_H
#define UTILS_H

int kerroKahdella(int luku);

#endif
//utils.cpp 
#include "utils.h"

int kerroKahdella(int luku) {
    return luku * 2;
}
Jotta saadaan toimiva sovellus pitäisi suorittaa komento:
  • g++ -c main.cpp utils.cpp
jolloin saadaan o-tiedostot ja sitten suoritetaan komento:
  • g++ main.o utils.o -o myapp
Prosessia voidaan helpottaa luomalla seuraavanlainen Makefile-tiedosto:

CXX = g++
#Windowsissa:
#CXX = C:\Qt\Tools\mingw1310_64\bin\g++
CXXFLAGS = -Wall -std=c++17

TARGET = myapp
OBJS = main.o utils.o

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)

%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

clean:
	rm -f *.o $(TARGET)
    
Komennot
  • make – kokoaa ohjelman oletuskohteen mukaan (yleensä "all")
  • make clean – poistaa väliaikaiset tiedostot (esim. .o-tiedostot ja lopullisen ohjelman)
Testaa:
  1. suorita komento make ja tutki mitä tiedostoja syntyi
  2. suorita komento ./myapp
  3. suorita komento make clean ja tutki mitä tiedostoja nyt on
Huom! Windowsissa sinun tulee mahdollisesti antaa komennot muodossa:
C:\Qt\Tools\mingw1310_64\bin\mingw32-make
Miksi käyttää makea?
  • Vähentää turhaa käännöstyötä – vain muuttuneet osat käännetään
  • Parantaa projektien hallittavuutta
  • Helpottaa toistettavuutta ja automaatiota
Esimerkki CMakeLists.txt tiedostosta

Jos edellisen esimerkin sovellus halutaan rakentaa cmake:lla voidaan luoda tiedosto CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)

project(myapp LANGUAGES CXX)

# C++-standardin asetus ja varoitukset
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")

# Lähdekoodit
set(SOURCES
    main.cpp
    utils.cpp
)

# Luo suoritettava tiedosto
add_executable(${PROJECT_NAME} ${SOURCES})

Komennot
  • mkdir build
  • cd build
  • cmake ..
  • make
Make vs CMake
Ominaisuus Make CMake
Abstraktiotaso Pienempi — kirjoitat suoraan säännöt (komennot, riippuvuudet). Korkeampi — kuvaat projektin (lähteet, kohteet, asetukset) ja CMake generoi build-järjestelmän.
Siirrettävyys Hyvä paikallisissa unix-ympäristöissä, mutta Makefile voi olla sidottu tiettyihin työkaluversioihin. Erinomainen — yksi CMakeLists.txt voi tuottaa Makefilet, Visual Studio -projektit, Xcode-projektit, jne.
Monimutkaiset projektit Hankala ylläpitää, koska kaiken logiikan pitää olla Makefilessä. Luotu monimutkaisiin projekteihin: kirjastot, alikansiot, testit, paketointi, konfigurointi.
Riippuvuuksien hallinta Usein käsin määriteltävä (.o-riippuvuudet ym.). Automaattinen; CMake tietää mitä kääntää ja miten linkittää kohteet.
Kääntäjä- ja alusta-abstrahointi Kirjoitat suoraan komennot kuten g++ — ei automaattista vaihtoa eri kääntäjien välillä. Tuntee GCC:n, Clangin, MSVC:n ym., ja muokkaa liput oikeiksi kullakin kääntäjällä.
Oppimiskäyrä Helppo aloittaa — suorat komennot ja säännöt. Vaatii opettelua (CMake-syntaksi ja käsitteet), mutta hyöty kasvaa projektin koon myötä.
Konfigurointi & lisäominaisuudet Rajoitetumpaa; monimutkaiset asetukset voivat vaatia paljon käsin työtä. Tukee globaaleja vaihtoehtoja, -D-muuttujia, testejä, pakkausta ja ulkoisia riippuvuuksia (find_package).
Kun kannattaa käyttää Pienet projektit, nopea prototypointi tai kun haluat täydellisen kontrollin yksittäisistä komennoista. Monialustaiset projektit, suuret koodikannat, kirjastot ja tapaukset joissa haluat automaattisia generointeja ja integraatioita.
Videot

Tein videot joilla käyn läpi edelliset esimerkit. Ensimmäisellä videolla asennan Windowsiin Ubuntun käyttäen WSL-systeemiä:



Toggle Menu