DEV Community

Lena
Lena

Posted on

3 1

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

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more