CMPLX 使用 GCC 产生未定义的符号
CMPLX Yields Undefined Symbol with GCC
我试图找出在使用 GCC 进行编译时使用复杂文字的问题。考虑以下
#include <stdio.h>
#include <complex.h>
int main(void)
{
double complex z = CMPLX(0.0, -1.0);
printf("z = %.1f%+.1fi\n", creal(z), cimag(z));
return 0;
}
(从 the reference page 稍作修改)。如果我用 Clang 编译,它会按预期工作。但是,如果我使用 GCC,我会得到一个未定义的引用错误
gcc -std=c11 mwe.c
mwe.c: 6:24 warning: implicit declaration of function 'CMPLX' ...
mwe.c:(...) undefined reference to `CMPLX'
我已经在 Linux 上使用 GCC 4.7 和 7.2 以及在 MacOS 上使用 GCC 9 进行了尝试。错误消息发生变化,但最终结果保持不变。查看 , this should be valid C11. Based on and this post,GCC 似乎以前接受过此构造。
我的底线问题是:为什么我不能将 CMPLX
与 GCC 一起使用?
这似乎是由于我的系统 header/library 断开连接所致。使用 -save-temps
标志编译,GCC 似乎使用系统 header 作为 complex.h
。这意味着所选 Xcode SDK 在 MacOS 上的 usr/include/complex.h
和 Linux 上的 /usr/include/complex.h
。在 MacOS 上,CMPLX
宏仅在使用 Clang 时定义。我拥有的 Linux 是 RHEL 6,这意味着 header 是针对没有 CMPLX
的 GCC 3。根据 this bug report 上的讨论,确保宏的定义似乎不是由 GCC 决定的。
简短的回答是:compiler/platform 组合不支持它。使用本机编译器或更新系统。
我试图找出在使用 GCC 进行编译时使用复杂文字的问题。考虑以下
#include <stdio.h>
#include <complex.h>
int main(void)
{
double complex z = CMPLX(0.0, -1.0);
printf("z = %.1f%+.1fi\n", creal(z), cimag(z));
return 0;
}
(从 the reference page 稍作修改)。如果我用 Clang 编译,它会按预期工作。但是,如果我使用 GCC,我会得到一个未定义的引用错误
gcc -std=c11 mwe.c
mwe.c: 6:24 warning: implicit declaration of function 'CMPLX' ...
mwe.c:(...) undefined reference to `CMPLX'
我已经在 Linux 上使用 GCC 4.7 和 7.2 以及在 MacOS 上使用 GCC 9 进行了尝试。错误消息发生变化,但最终结果保持不变。查看
我的底线问题是:为什么我不能将 CMPLX
与 GCC 一起使用?
这似乎是由于我的系统 header/library 断开连接所致。使用 -save-temps
标志编译,GCC 似乎使用系统 header 作为 complex.h
。这意味着所选 Xcode SDK 在 MacOS 上的 usr/include/complex.h
和 Linux 上的 /usr/include/complex.h
。在 MacOS 上,CMPLX
宏仅在使用 Clang 时定义。我拥有的 Linux 是 RHEL 6,这意味着 header 是针对没有 CMPLX
的 GCC 3。根据 this bug report 上的讨论,确保宏的定义似乎不是由 GCC 决定的。
简短的回答是:compiler/platform 组合不支持它。使用本机编译器或更新系统。