Build avec CMake un programme utilisant des threads
by Baduit
La problématique
Lorsque vous utilisez la bibliothèque de support des threads de la bibliothèque standard, si vous utilisez gcc ou clang vous allez devoir linker votre programme avec la bibliothèque pthread. Pourquoi ? Car la libc++ et la libstdc++ (les implémentations de la bibliothèque standard de clang et de gcc) ont été linkées dynamiquement avec pthread. Du coup, dans votre ligne de compilation vous devez ajouter -lpthread
.
Si vous utilisez CMake comme système de build, la première idée qui vous vient est sûrement de regarder si vous n’êtes pas sur Windows, ou bien si vous utilisez clang ou gcc et de linker avec pthread dans ce cas là. Mais il existe une manière plus courte et plus portable de le faire !
La solution
Il suffit tout simplement d’appeler la fonction find_package pour chercher le package Threads, puis de linker votre cible avec la bibliothèque Threads::Threads.
1
2
find_package(Threads REQUIRED)
target_link_libraries(your_target PRIVATE Threads::Threads)
Voilà, c’est aussi simple que ça ! Pas besoin d’avoir de comportement différent en fonction du compilateur ou de la plateforme, et en plus c’est portable.
Exemple complet
Voici un exemple complet. On essaye donc de compiler ce fichier main.cpp :
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <thread>
#include <chrono>
int main ()
{
using namespace std::chrono_literals;
std::cout << "Before sleep" << std::endl;
std::this_thread::sleep_for(2s);
std::cout << "After sleep." << std::endl;
}
Et voici le CMakeLists.txt correspondant :
1
2
3
4
5
6
cmake_minimum_required(VERSION 3.9)
project(ThreadExample VERSION 1.0.0 DESCRIPTION "A simple program using threads support library.")
find_package(Threads REQUIRED)
add_executable(my_target main.cpp)
target_link_libraries(api PRIVATE Threads::Threads)