After a system upgrade (Arch linux) I couldn't compile my project anymore. One of the problems was that there isn't a -pthread flag passed to the compiler anymore.
I managed to write a minimal test case:
The CMakeLists.txt file contains:
cmake_minimum_required(VERSION 3.22) project(pthread_test) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) add_executable(test test.cpp) target_link_libraries(test Threads::Threads) test.cpp in the same directory contains:
#ifndef _REENTRANT #error "-pthread was not used" #endif int main() { } Then running cmake as follows:
daniel:~/pthreadtest>cmake -DCMAKE_VERBOSE_MAKEFILE=ON . -- The C compiler identification is GNU 11.2.0 -- The CXX compiler identification is GNU 11.2.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Looking for pthread.h -- Looking for pthread.h - found -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success -- Found Threads: TRUE -- Configuring done -- Generating done -- Build files have been written to: /home/carlo/pthreadtest Results in a Makefile that does not use -pthread:
daniel:~/pthreadtest>make /usr/bin/cmake -S/home/carlo/pthreadtest -B/home/carlo/pthreadtest --check-build-system CMakeFiles/Makefile.cmake 0 /usr/bin/cmake -E cmake_progress_start /home/carlo/pthreadtest/CMakeFiles /home/carlo/pthreadtest//CMakeFiles/progress.marks make -f CMakeFiles/Makefile2 all make[1]: Entering directory '/home/carlo/pthreadtest' make -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/depend make[2]: Entering directory '/home/carlo/pthreadtest' cd /home/carlo/pthreadtest && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/carlo/pthreadtest /home/carlo/pthreadtest /home/carlo/pthreadtest /home/carlo/pthreadtest /home/carlo/pthreadtest/CMakeFiles/test.dir/DependInfo.cmake --color= Consolidate compiler generated dependencies of target test make[2]: Leaving directory '/home/carlo/pthreadtest' make -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/build make[2]: Entering directory '/home/carlo/pthreadtest' [ 50%] Building CXX object CMakeFiles/test.dir/test.cpp.o /usr/bin/c++ -MD -MT CMakeFiles/test.dir/test.cpp.o -MF CMakeFiles/test.dir/test.cpp.o.d -o CMakeFiles/test.dir/test.cpp.o -c /home/carlo/pthreadtest/test.cpp /home/carlo/pthreadtest/test.cpp:2:2: error: #error "-pthread was not used" 2 | #error "-pthread was not used" | ^~~~~ make[2]: *** [CMakeFiles/test.dir/build.make:79: CMakeFiles/test.dir/test.cpp.o] Error 1 make[2]: Leaving directory '/home/carlo/pthreadtest' make[1]: *** [CMakeFiles/Makefile2:86: CMakeFiles/test.dir/all] Error 2 make[1]: Leaving directory '/home/carlo/pthreadtest' make: *** [Makefile:94: all] Error 2 Note that adding -pthread makes it work fine:
daniel:~/pthreadtest>/usr/bin/c++ -MD -MT CMakeFiles/test.dir/test.cpp.o -MF CMakeFiles/test.dir/test.cpp.o.d -o CMakeFiles/test.dir/test.cpp.o -c /home/carlo/pthreadtest/test.cpp -pthread Can someone tell me what I am doing wrong? Or is this a bug in cmake?