非root环境本地安装gcc/clang无法编译C++多线程代码问题咨询
宏默认禁用的根本原因
这两个宏是编译GCC自身时由configure脚本根据目标系统的依赖检测结果自动写入GCC公共配置头文件c++config.h的静态配置项,不会在GCC安装完成后动态调整。出现默认禁用的情况一般来自两种异常:
- 你当初手动编译GCC 5.4.0时,configure阶段没有检测到系统的posix线程开发依赖(pthread相关头文件、库),自动关闭了C++标准库的多线程功能支持;也有可能是你当时添加了
--disable-threads这类错误的编译配置参数,主动关闭了多线程支持 - 后续服务器的系统头文件路径、你的个人环境变量(
CPATH/LD_LIBRARY_PATH等)发生了变更,导致原本正常的GCC运行时无法匹配到pthread依赖,触发了标准库头文件里的宏屏蔽逻辑,多线程相关的类定义全部被隐藏
正确解决方法
手动修改单个标准库头文件属于临时 workaround,不推荐长期使用,可根据你的场景选择以下任意一种方案:
方案1:重编本地GCC(最彻底)
该方案可以从根源解决所有标准库兼容问题:
- 先确认系统存在
/usr/include/pthread.h、/usr/lib64/libpthread.so这类基础pthread依赖,或者将pthread相关依赖预先安装到你的$HOME目录 - 重新执行GCC的configure流程,明确添加
--enable-threads=posix参数,确认configure输出中thread model项的值为posix后,再执行make && make install完成安装
方案2:修改GCC公共配置头文件(无需重编GCC)
不用逐个修改thread、mutex头文件,直接修改所有标准库头文件都会引用的公共配置文件即可,修改一次全局生效:
- 找到配置文件路径,一般为
$HOME/local/include/c++/5.4.0/$(gcc -dumpmachine)/c++config.h - 在文件中添加/修改两行宏定义:
#define _GLIBCXX_HAS_GTHREADS 1 #define _GLIBCXX_USE_C99_STDINT_TR1 1
- 你本地安装的clang同样依赖该GNU C标准库,修改完成后clang的编译问题也会同步解决
方案3:编译时手动注入宏(无需修改本地文件)
适合临时使用、不想修改本地GCC文件的场景,每次编译多线程代码时在编译参数中添加对应的-D参数即可:
$HOME/g++ -std=c++11 -lpthread -D_GLIBCXX_HAS_GTHREADS=1 -D_GLIBCXX_USE_C99_STDINT_TR1=1 mut.cc
内容的提问来源于stack exchange,提问作者MadMax
相关产品推荐
相关产品推荐

