![nvcc/gcc 在 Ubuntu 20.04/21.04 中损坏:如何修补 gcc(通过 apt 安装)?](https://linux22.com/image/938972/nvcc%2Fgcc%20%E5%9C%A8%20Ubuntu%2020.04%2F21.04%20%E4%B8%AD%E6%8D%9F%E5%9D%8F%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BF%AE%E8%A1%A5%20gcc%EF%BC%88%E9%80%9A%E8%BF%87%20apt%20%E5%AE%89%E8%A3%85%EF%BC%89%EF%BC%9F.png)
问题:应用 gcc 补丁的分步解决方案是什么,特别是当它通过 apt 安装时?(我想应用提到的那个这里)
我尝试按照多个指南来修补 gcc,但它们要么依赖于 gcc 是通过源代码安装的,要么依赖于通过 git 安装的。此外,对于经验不足的用户来说,补丁是什么/它是哪个文件/它是什么样子的、如何从错误报告中获取它以及如何应用它,这些都非常令人困惑。按照指南中概述的步骤操作时,我要么收到错误,提示无法正确解析下载的补丁,要么似乎什么也没发生。是这补丁?
背景:gcc 10.3 中有一个错误:“编译器在使用 nvcc 的 chrono 库上因分段错误而崩溃”(见下面的错误消息)。错误报告中提到的补丁未包含在 apt 附带的版本中。因此,Ubuntu 20.04(可能是 21.04,以及其他 Linux 发行版)附带了损坏的版本,因此无法编译 CUDA 代码。请注意,该错误应该在 gcc 11 中得到修复,但这似乎不受 CUDA 支持。
错误信息:
/usr/include/c++/10/chrono: In substitution of ‘template<class _Rep, class _Period> template<class _Period2> using __is_harmonic = std::__bool_constant<(std::ratio<((_Period2::num / std::chrono::duration<_Rep, _Period>::_S_gcd(_Period2::num, _Period::num)) * (_Period::den / std::chrono::duration<_Rep, _Period>::_S_gcd(_Period2::den, _Period::den))), ((_Period2::den / std::chrono::duration<_Rep, _Period>::_S_gcd(_Period2::den, _Period::den)) * (_Period::num / std::chrono::duration<_Rep, _Period>::_S_gcd(_Period2::num, _Period::num)))>::den == 1)> [with _Period2 = _Period2; _Rep = _Rep; _Period = _Period]’:
/usr/include/c++/10/chrono:473:154: required from here
/usr/include/c++/10/chrono:428:27: internal compiler error: Segmentation fault
428 | _S_gcd(intmax_t __m, intmax_t __n) noexcept
| ^~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-10/README.Bugs> for instructions.
ninja: build stopped: subcommand failed.
我到目前为止尝试过的:
- 彻底清除与 Nvidia/CUDA 相关的所有内容并重新安装(我尝试了 CUDA 版本 11.2、11.3、11.4)
- 升级到 gcc-11 g++-11,但是这个似乎不受 CUDA 支持
- 修补 gcc,但我失败了,或者这似乎没有任何作用
- 降级到 gcc-9 可以解决问题,但我认为不是一个长期的解决方案
有关的:
- 另一个关于错误报告的帖子
- NVCC/nccl 的错误报告- 这里他们提到了如何直接修改 gcc 源,但我似乎找不到它,而且它似乎不是一个很好的解决方案......
- redhat bugzilla 上的错误报告