【问题标题】:CMPLX Yields Undefined Symbol with GCCCMPLX 使用 GCC 生成未定义符号
【发布时间】:2020-01-05 14:11:32
【问题描述】:

我试图在使用 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 进行了尝试。错误消息发生变化,但最终结果保持不变。查看reference for CMPLX,这应该是有效的C11。基于this answerthis post,看来GCC 以前接受过这种构造。

我的底线问题是:为什么我不能将CMPLX 与 GCC 一起使用?

【问题讨论】:

  • 错误信息改变了,但最终结果保持不变 - 如何改变?
  • CMPLX 在 C11 中显然是有效的:7.3.9.3 The CMPLX macros
  • 无法在wandbox.org上的两个 GCC 版本上重现
  • @eugene 微不足道的错误格式差异。两行对一行,包括触发与否的标志。
  • 您的gcc 命令是别名还是直接执行正确的gcc 可执行文件本身?不管你的gcc 命令接受-std=c11 参数然后不能正确处理CMPLX 这一事实很奇怪。

标签: c gcc complex-numbers


【解决方案1】:

这似乎是由我拥有的系统上的标头/库断开连接引起的。使用-save-temps 标志编译,GCC 似乎使用complex.h 的系统标头。这意味着在 MacOS 上选择的 Xcode SDK 的 usr/include/complex.h 和在 Linux 上的 /usr/include/complex.h。在 MacOS 上,CMPLX 宏仅在使用 Clang 时定义。我拥有的 Linux 是 RHEL 6,这意味着标头针对没有 CMPLX 的 GCC 3。根据this bug report 上的讨论,确保宏的定义似乎不符合 GCC。

简短的回答是:编译器/平台组合不支持它。使用本机编译器或更新系统。

【讨论】:

    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2017-07-31
    相关资源
    最近更新 更多