Intel编译器编译C++14检测代码报__malloc__属性不接受参数错误
问题成因
- 核心矛盾是glibc 2.34版本新增的带参数
__malloc__属性语法,和旧版本Intel编译器、CUDA编译器的属性解析逻辑不兼容。 - GCC从11版本开始支持带参数的
__malloc__属性,用于标记内存分配函数对应的释放函数,提升静态分析能力,glibc 2.34直接使用了这个语法扩展来标注标准库函数。 - 2021.3.0版本的Intel classic编译器(icpc)、11.5及更早版本的CUDA nvcc编译器,没有跟进支持GCC的这个新属性语法,解析时遇到带参数的
__malloc__就会抛出语法错误,哪怕你编译的是自己写的正确代码,只要包含了glibc的标准头文件就会触发报错。 - 你原本的C++14检测代码本身没有语法错误,排除了MSVC的宏检测逻辑也没问题,报错完全来自系统标准库头文件和编译器的兼容性冲突。
可行修复方案
临时编译绕过(无需修改代码/系统环境)
编译时给编译器添加-D__attribute__(x)=参数,临时禁用属性解析:
# Intel编译器 icpc -std=c++14 -D__attribute__(x)= test.cpp -o test # CUDA编译器 nvcc -std=c++14 -D__attribute__(x)= test.cu -o test
注意:该方案会禁用所有属性解析,可能丢失部分优化、警告能力,仅适合临时验证代码使用。
针对性修复(保留正常属性功能)
编译时添加宏定义-D__malloc__=__malloc__,单独屏蔽带参数的malloc属性解析:
icpc -std=c++14 -D__malloc__=__malloc__ test.cpp -o test
这个方案只会忽略__malloc__属性的参数,其他属性功能不受影响,适用场景更广泛。
永久修复
- 升级Intel编译器到2022.1.0及以上版本,该版本已经适配了glibc 2.34的新属性语法。
- 升级CUDA到11.6及以上版本,官方已修复该兼容性问题。
- 如果不能升级编译器,可降级glibc到2.33及更早版本,避开引入新属性的版本。
内容的提问来源于stack exchange,提问作者arc_lupus
相关产品推荐
相关产品推荐

