DEV Community

Lena
Lena

Posted on

Build avec CMake un programme utilisant des threads

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.

find_package(Threads REQUIRED)
target_link_libraries(your_target PRIVATE Threads::Threads)
Enter fullscreen mode Exit fullscreen mode

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 :

#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;
}
Enter fullscreen mode Exit fullscreen mode

Et voici le CMakeLists.txt correspondant :

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)
Enter fullscreen mode Exit fullscreen mode

Sources

Top comments (0)