linux - cmake 停止使用 -pthread

标签 linux cmake

系统升级(Arch linux)后,我无法再编译我的项目。 问题之一是不再有 -pthread 标志传递给编译器。

我设法编写了一个最小的测试用例:

CMakeLists.txt 文件包含:

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包含:

#ifndef _REENTRANT
#error "-pthread was not used"
#endif

int main()
{
}

然后运行cmake如下:

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

生成不使用 -pthread 的 Makefile:

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

请注意,添加 -pthread 可以使其正常工作:

 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

有人可以告诉我我做错了什么吗?或者这是 cmake 中的一个错误?

最佳答案

您的 CMake 输出缺少一行

Check if compiler accepts -pthread

对应于标志THREADS_PREFER_PTHREAD_FLAG

当检查 CMAKE_HAVE_LIBC_PTHREAD 成功时,CMake 3.22 似乎错误地忽略了此标志。

这应该在 CMake 3.23 中修复(提交:https://github.com/Kitware/CMake/commit/68285bc8a91586ae47315679212eaef737af6cc0)。

关于linux - cmake 停止使用 -pthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71149923/

相关文章:

python - WebDriverException : Message: unknown error: Chrome failed to start: crashed error using ChromeDriver Chrome through Selenium Python on Amazon Linux

linux - 如何在 Bluez Linux 中测试配置文件?

cmake - 静态链接 libc

visual-studio - 强制 msbuild 构建在解决方案配置中未选中的项目

cmake - 使用 `vcpkg` 配置 CMake 项目的惯用方法是什么?

linux - 不同文件类型的部分文件重命名

linux - Killall -u 和 RedHat 3

linux - 带有 fPIC 编译器标志的 CrossCompile openssl 不起作用(找不到 e_os.h)

CMake py.test 检测?

c - 在 Windows 上使用 Cmake/CLion 编译 lzma 库的一种简单方法?