编译时遇pthread宏错误__PTHREAD_SPINS未声明的解决求助
编译pthread代码时
__PTHREAD_SPINS未定义错误的解决 问题背景
长期遭遇编译pthread相关代码时的宏错误,首次出现于编译新下载的库,已重装g++、gcc、build-essential和libc6,问题仍存在。以下是复现用的简化代码、构建配置、错误信息及系统环境:
复现代码
C++示例代码
#include <iostream> #include <pthread.h> int main() { pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_destroy(&m); std::cout << "Hello, World!" << std::endl; return 0; }
CMakeLists.txt
project(clion_pthread) set(CMAKE_CXX_STANDARD 14) # Find the Threads package (this finds pthreads on UNIX) find_package(Threads REQUIRED) # Add your executable add_executable(clion_pthread main.cpp) # Link the executable to the Threads library target_link_libraries(clion_pthread Threads::Threads)
错误信息
clion_pthread/cmake-build-debug --target clion_pthread -- -j 6 [ 50%] Building CXX object CMakeFiles/clion_pthread.dir/main.cpp.o In file included from /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:35, from /usr/include/x86_64-linux-gnu/c++/9/bits/gthr.h:148, from /usr/include/c++/9/ext/atomicity.h:35, from /usr/include/c++/9/bits/ios_base.h:39, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from /clion_pthread/main.cpp:1: clion_pthread/main.cpp: In function ‘int main()’: clion_pthread/main.cpp:5:25: error: ‘__PTHREAD_SPINS’ was not declared in this scope 5 | pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; | ^~~~~~~~~~~~~~~~~~~~~~~~~ make[3]: *** [CMakeFiles/clion_pthread.dir/build.make:76: CMakeFiles/clion_pthread.dir/main.cpp.o] Error 1 make[2]: *** [CMakeFiles/Makefile2:83: CMakeFiles/clion_pthread.dir/all] Error 2 make[1]: *** [CMakeFiles/Makefile2:90: CMakeFiles/clion_pthread.dir/rule] Error 2 make: *** [Makefile:124: clion_pthread] Error 2
系统环境
No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal
解决方法
添加_POSIX_C_SOURCE宏定义:
__PTHREAD_SPINS是依赖POSIX标准的内部宏,需显式启用POSIX特性。在CMakeLists.txt中添加:target_compile_definitions(clion_pthread PRIVATE _POSIX_C_SOURCE=200809L)或直接在代码
<pthread.h>前添加:#define _POSIX_C_SOURCE 200809L调整头文件包含顺序:确保
<pthread.h>在C++标准库头文件之前引入,避免标准库提前加载不完整的pthread相关内容:#include <pthread.h> #include <iostream>验证并修复pthread头文件:执行命令检查头文件是否包含目标宏:
cat /usr/include/pthread.h | grep __PTHREAD_SPINS若无输出,说明头文件损坏,重新安装
libc6-dev:sudo apt-get install --reinstall libc6-dev替换静态初始化宏:若上述方法无效,改用动态初始化替代
PTHREAD_MUTEX_INITIALIZER:pthread_mutex_t m; pthread_mutex_init(&m, NULL);
内容的提问来源于stack exchange,提问作者Gil
相关产品推荐
相关产品推荐

