【问题标题】:sqrt() function not working with variable arguments [duplicate]sqrt()函数不适用于可变参数[重复]
【发布时间】:2011-04-01 19:22:17
【问题描述】:

我不知道我是否遗漏了一些明显的东西,但似乎我无法在 C 中计算 变量 的平方根; sqrt() 函数似乎只适用于常量。这是我的代码:

#include <math.h>
#include <stdio.h>

int main()
{
    double a = 2.0;
    double b = sqrt(a);
    printf("%f", b);
    return 0;
}

当我运行这个程序时,我得到以下错误:

gcc -Wall -o "test2" "test2.c" (in directory: /home/eddy/Code/euler)
/tmp/ccVfxkNh.o: In function `main':
test2.c:(.text+0x30): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Compilation failed.

但是,如果我将 sqrt() 中的参数替换为常数,例如 2.0,例如 (b = sqrt(2.0)),那么它可以正常工作。 sqrt() 不应该与变量或其他东西一起使用吗?

感谢您的帮助

【问题讨论】:

    标签: c compiler-errors math.h sqrt


    【解决方案1】:

    如果是 gcc,您需要链接库。

    gcc 文件名.c -lm .

    但是,如果是 g++,则无需链接库,因此可以正常工作:

    g++ 文件名.c -o 文件名 一旦编译成功。

    要运行,只需在 G++ 中输入 ./filename。 并在 Gcc 中输入 ./a.out。

    【讨论】:

      【解决方案2】:

      gcc 默认不链接标准库。所以如果通过 gcc 编译你只需要这样做:

      gcc 文件名.c -lm

      但是,如果是 g++,则无需链接库,因此可以正常工作:

      g++ 文件名.c -o 文件名

      【讨论】:

        【解决方案3】:

        使用“”运算符包含数学库

        #include " math.h "
        

        使用-lm 选项编译程序以继承数学库 假设我们的程序名是test.c,我们编译如下

        gcc test.c -lm
        

        【讨论】:

        • OP 中的&lt;math.h&gt; 形式对于标准标题更正确。此外," math.h "(带空格)也不起作用。
        【解决方案4】:

        这对我来说很好。我认为你的数学库有问题。尝试再次链接它并查看。其他明智的代码是完全完美的。

        【讨论】:

          【解决方案5】:

          编译:

          gcc -Wall -o test2 test2.c -lm
          

          您需要链接到数学库。

          【讨论】:

            【解决方案6】:

            使用命令gcc -Wall -o "test2" "test2.c" -lm 可能会解决此问题。

            这包括除了标准 C 运行时库之外的数学库。在大多数系统上,数学库历来是一个需要明确请求的独立实体。

            【讨论】:

              【解决方案7】:

              您需要链接到数学库(在命令行上使用“-lm”)。在常量情况下,编译器可能很聪明并预先计算 sqrt(2.0)(所以编译的代码本质上是 'b = 1.414...;')

              【讨论】:

              • 这很乏味。那么其他库呢,gcc 是否每个都有一个选项?
              • @qed 不,只有一个:-l。因此,-lm 选择一个名为“libm.a”的库; -lfRod0 将选择一个名为 'libfRod0.a' 的库。事实上,在 gcc 出现之前的 unix 远古时代就一直如此。
              猜你喜欢
              • 1970-01-01
              • 2023-02-13
              • 2015-01-14
              • 2014-10-13
              • 2022-01-12
              • 2018-09-05
              • 1970-01-01
              • 2012-03-07
              • 1970-01-01
              相关资源
              最近更新 更多