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.
Jos käytät CMakea, voit valita eri build-järjestelmiä, kuten Make, Ninja tai Visual Studio -projektit. Oheisesta artikkelista löydät lisätietoa Ninja-build-järjestelmästä: Ninja build-järjestelmä
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.
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.
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 objektitiedostot, suoritetaan komento:
g++ -c main.cpp utils.cppjonka jälkeen voidaan linkittää objektitiedostot komennolla:
g++ main.o utils.o -o myappSuoritettava sovellus on nimeltään 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)
| Komento | Mitä tekee | Tyypillinen käyttötarkoitus |
|---|---|---|
| g++ main.cpp utils.cpp -o myapp | Kääntää ja linkittää | Pieni ohjelma, nopea testaus |
| g++ -c main.cpp utils.cpp | Kääntää vain (tuottaa .o-tiedostot) | Esi- tai välikäännösvaihe |
| g++ main.o utils.o -o myapp | Linkittää valmiit objektit | Rakennusvaihe isommissa projekteissa |
make – kokoaa ohjelman oletuskohteen mukaan (yleensä "all")make clean – poistaa väliaikaiset tiedostot (esim. .o-tiedostot ja lopullisen ohjelman)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})
| 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. |
Tein videot joilla käyn läpi edelliset esimerkit. Ensimmäisellä videolla asennan Windowsiin Ubuntun käyttäen WSL-systeemiä: