You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu22.04下CUDA8+GCC5.3的nvcc用-O1编译报错,求修复方案

问题描述

我有一个CUDA-8程序,7个月前在Ubuntu 22.04上配置后可通过nvcc正常编译,底层编译器为gcc (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413。但某次Ubuntu包更新后,仅当优化标志设为-O0时才能编译成功。

最小复现示例

文件test.cpp内容:

int
main(int argc, char* argv[]) {
    return 1;
}

正常编译命令

/opt/cuda-8.0/bin/nvcc -w --use_fast_math -Wno-deprecated-gpu-targets -O0 -x cu -c test.cpp

报错编译命令

/opt/cuda-8.0/bin/nvcc -w --use_fast_math -Wno-deprecated-gpu-targets -O1 -x cu -c test.cpp

报错信息

/usr/include/x86_64-linux-gnu/bits/string_fortified.h(104): error: identifier "__builtin___stpncpy_chk" is undefined

请问能否通过修改string_fortified.h文件解决该问题?


解决方案分析

不建议直接修改系统头文件string_fortified.h,原因如下:

  • 系统包更新会覆盖修改内容,问题会在下次更新后复发;
  • 修改系统头文件可能破坏其他依赖该文件的程序,引发不可预知的兼容性问题。

问题根源是Ubuntu更新后,系统C库的fortified头文件引入了gcc 5.3.1不支持的内置函数__builtin___stpncpy_chk。CUDA 8官方支持的gcc版本上限为5.x,但Ubuntu 22.04的系统头文件是为更高版本gcc设计的,更新后出现版本不匹配。

可行解决方法:

  • 指定旧版头文件路径:单独保存gcc 5.3.1对应的头文件,编译时通过-I参数让nvcc优先使用这套头文件,而非系统更新后的版本;
  • 禁用fortified函数:编译时添加-U_FORTIFY_SOURCE或-D_FORTIFY_SOURCE=0参数,强制关闭C库的fortified安全增强特性,避免触发未定义的内置函数;
  • 固定系统包版本:回滚更新的系统C库相关包到之前能正常编译的版本,通过apt-mark hold锁定版本防止后续更新覆盖。

其中,添加-D_FORTIFY_SOURCE=0到编译命令是最快捷的临时修复方式,修改后的命令:

/opt/cuda-8.0/bin/nvcc -w --use_fast_math -Wno-deprecated-gpu-targets -O1 -x cu -c test.cpp -D_FORTIFY_SOURCE=0

内容的提问来源于stack exchange,提问作者ferdymercury

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:15:02