两个编译器互不喜欢

Two compilers do not like each other

本文关键字:编译器 不喜欢 两个      更新时间:2023-10-16

我试图用ICC编译代码,但遇到了一个错误:

/opt/intel/composer_xe_2013.2.146/compiler/include/xmmintrin.h(82): error:
linkage specification is incompatible with previous "_mm_malloc" (declared at
line 38 of "/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include/mm_malloc.h")
extern void* __ICL_INTRINCC _mm_malloc(size_t, size_t);

看起来国际商会和海湾合作委员会有冲突。但我不能将GCC排除在$PATH之外。如何解决这种困惑?

问题出在我编译的代码中。我们包括malloc头,这对于ICC和GCC是不同的。还有GCC标头名称。

解决方案是:

#if defined(__INTEL_COMPILER)
#include <malloc.h>
#else
#include <mm_malloc.h>
#endif // defined(__GNUC__)

我遇到了同样的问题,英特尔编译器被gcc标头中的声明弄糊涂了<mm_ alloc.h>,但在我的例子中,这个头被一个库头拖了进来,我不想更改。

对我来说有效的是全局禁用mm_malloc.h,方法是用#define触发它自己的include-guard,比如:

icc -D_MM_MALLOC_H_INCLUDED=1    main.cpp -o main

您也可以使用相同的#define:在单个文件或标头中禁用它

#ifdef __INTEL_COMPILER
#  define _MM_MALLOC_H_INCLUDED 1 /* disables gcc's <mm_malloc.h>, for Intel */
#endif

英特尔编译器从xmmintrin(或其他SSE/AVX标头)中获取自己的mm_malloc定义,因此即使有人在调用mm_malloc。