2

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?

1
  • @Tsyvarev Oops! You are absolutely right. I fixed this, thanks. Commented Feb 16, 2022 at 22:47

1 Answer 1

2

Your output of CMake misses a line like

Check if compiler accepts -pthread 

which corresponds to flag THREADS_PREFER_PTHREAD_FLAG.

It seems that CMake 3.22 incorrectly ignores this flag when check CMAKE_HAVE_LIBC_PTHREAD is successful.

This should be fixed in CMake 3.23 (commit: https://github.com/Kitware/CMake/commit/68285bc8a91586ae47315679212eaef737af6cc0).

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.