Compile
Single file
Most basic command for compiling:
g++ -o myapp main.cppAdding some options may help debugging for development:
g++ -o myapp -Wall -Wextra -Werror main.cppExample of a hello world program:
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}For more printing features, use the fmt library (add -lfmt to CFLAGS) and write the code like this:
#include <fmt/base.h>
int main() {
fmt::print("Hello, world!\n");
return 0;
}Makefile
We have to teach Makefile how to compile .cpp files into .o files. This step is not needed in C, but needed in C++.
TIP
As for the time this is being written, gnu++17 is the default for g++.
Enable newer features by adding -std=c++20 or -std=c++23 into CFLAGS.
CXX = g++
CXXFLAGS = -Wall -Wextra -Werror $(EXTRA_CFLAGS)
OBJ = main.o
TARGET = myapp
.PHONY: build clean
build: $(OBJ)
$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJ)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(TARGET) $(OBJ)CMake
There are two steps to set up a project for CMake usage.
Add files
First you need to place (at least) two files to your project.
CMakeLists.txt
src
└── main.cppsrc/main.cppis a C++ program that compilesCMakeLists.txtis the project's configuration
A very simple CMakeLists.txt:
cmake_minimum_required(VERSION 3.24)
# Project structure
project(myapp
VERSION 0.1.0
LANGUAGES CXX)
add_executable(myapp src/main.cpp)
# Dependencies
find_package(fmt REQUIRED)
target_link_libraries(myapp PRIVATE fmt::fmt)
# Installation
install(TARGETS myapp DESTINATION bin)myapp here will be name of the binary generated.
This example is also showing to add a library (fmt) as dependency.
Build
Considering a build that will use:
| Directory | Purpose |
|---|---|
target/debug | Debug builds |
target/release | Release builds |
First we create the build directories that includes some build configuration like the compiler and a generator. These commands have to be run only once.
cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Debug -S. -Btarget/debug
cmake -GNinja -DCMAKE_INSTALL_PREFIX:STRING=$HOME/.local -DCMAKE_BUILD_TYPE:STRING=Release -S. -Btarget/releaseThen, for a debug build & run:
cmake --build target/debug
./target/debug/myappFor a release build & install (this will install the binary into ~/.local/bin because we have CMAKE_INSTALL_PREFIX set):
cmake --build target/release
cmake --install target/release --stripTo uninstall:
xargs -d '\n' rm -v <target/release/install_manifest.txt