使用Clang编译GCC生成的.i文件报错的问题咨询
编译问题咨询
代码示例
#include <stdio.h> int main() { printf("hello, world"); }
操作步骤
- 生成.i文件
gcc -E test.cpp -o test.cpp.ii - 使用Clang编译.i文件生成.o文件
clang++ -c test.cpp.ii -o test.cpp.o
错误信息
In file included from test.cpp:1: /usr/include/stdio.h:189:48: error: '__malloc__' attribute takes no arguments __attribute__ ((__malloc__)) __attribute__ ((__malloc__ (fclose, 1))) ; ^ /usr/include/stdio.h:201:49: error: '__malloc__' attribute takes no arguments __attribute__ ((__malloc__)) __attribute__ ((__malloc__ (fclose, 1))) ; ^ /usr/include/stdio.h:223:77: error: use of undeclared identifier '__builtin_free'; did you mean '__builtin_frexp'? noexcept (true) __attribute__ ((__malloc__)) __attribute__ ((__malloc__ (__builtin_free, 1))); ^ /usr/include/stdio.h:223:77: note: '__builtin_frexp' declared here /usr/include/stdio.h:223:65: error: '__malloc__' attribute takes no arguments noexcept (true) __attribute__ ((__malloc__)) __attribute__ ((__malloc__ (__builtin_free, 1)));
补充说明:使用GCC直接编译该.i文件生成.o文件一切正常。
咨询问题
__attribute__((__malloc__))是GCC独有的特性吗?- 在此场景下,如何让Clang正确生成.o文件?
问题1解答
__attribute__((__malloc__))基础版本不是GCC独有——Clang也支持无参数的__malloc__,用来标记函数返回的内存是独立分配的,不会和其他指针指向同一块内存。但带参数的__malloc__(fclose, 1)这种用法是GCC独有的扩展,Clang并不支持这种指定释放函数的语法。
问题2解答
有两种可行方案解决这个问题:
- 方案一:用Clang重新生成预处理文件
不要用GCC生成.ii文件,直接用Clang完成预处理+编译流程,命令如下:
原因是GCC预处理时会保留自身独有的扩展属性语法,而Clang处理自己生成的预处理文件时,会用兼容自身的逻辑处理头文件中的属性。clang++ -E test.cpp -o test.cpp.ii && clang++ -c test.cpp.ii -o test.cpp.o - 方案二:添加GCC兼容编译选项
如果必须使用GCC生成的.ii文件,编译时可以启用GCC兼容模式,命令如下:
不过更稳妥的还是优先用Clang自己生成预处理文件,毕竟不同编译器预处理后的文件可能包含各自的扩展语法,跨编译器使用容易出现兼容性问题。clang++ -c test.cpp.ii -o test.cpp.o -std=gnu++17 -fgnu89-inline
内容的提问来源于stack exchange,提问作者cfg
相关产品推荐
相关产品推荐

