【问题标题】:C - undefined reference to "sqrt" even with '-lm'C - 即使使用“-lm”,对“sqrt”的未定义引用
【发布时间】:2015-02-13 01:44:51
【问题描述】:

我尝试用 C 编译一个需要“math.h”的库,这里是 .c 文件的开头:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h> 
#include "sparse_matrix.h"
...

我用这个命令编译:

gcc -c ./sparse_matrix.c -o sparse_matrix.o -lm -Wall -pedantic -std=c99 -g -O

但即使 #include done 和文件后的标志 -lm (我已经尝试在行尾但没有任何改变)我仍然得到错误: undefined reference to « sqrt » collect2: error: ld returned 1 exit status

在谷歌上搜索了一个小时后我没有得到它。 我在 ubuntu 14.10(utopic unicorn)下使用 gcc 4.9。 提前感谢您的帮助!

【问题讨论】:

  • -c 选项禁止链接。您不会从该命令行收到该错误。因此,这不是产生错误的命令行。 (不要在 makefile 中使用 @ 之前的规则——这可能不是你的问题,但它隐藏了命令并可能误导你。)大部分都是 @paxdiablo 所说的。

标签: c gcc ld math.h


【解决方案1】:

我不认为 is 您正在运行的命令(嗯,它可能是其中 一个,但它肯定不是导致您的错误的那个) .

gcc-c 选项告诉它只创建目标文件(并且您专门将输出发送到 sparse_matrix.o,目标文件而不是可执行文件)。

在这种情况下,应该调用链接器。

事实上,有一个虚拟的sparse_matrix.c

#include <math.h>
int main(void) {
    return (int)(sqrt(16.0));
}

您的命令运行良好,当我完成该过程时:

pax> gcc -o sparse_matrix sparse_matrix.o -lm
pax> ./sparse_matrix
pax> echo $?
4

你可以看到它也运行得很好。

可能是您在实际 link 阶段忽略了链接器标志(例如 -lm),这会导致此问题。它们应该对编译阶段没有影响(除非它们同时影响编译 链接阶段,但 -l 不是其中之一)。

而且,通过“离开”,我还包括“错位”的可能性。一些链接器在处理库的方式上是定位的,因为它们只会从库中提取对象,如果它们在列出的位置满足未定义的符号 p>

所以,命令:

linker sparse_matrix.o -lm ...

会起作用,因为.o 文件引入了对sqrt 的不满足引用,libm 满足了该引用。如果你的链接器位置的,那么:

linker -lm sparse_matrix.o ...

不起作用,因为在处理 libm 时,没有个不满意的符号,因此没有提取任何内容。然后在该点之后引入对sqrt 的未定义引用,并且没有其他对象或库可以满足它。

ldgcc 链接器阶段是否有这种限制,我不知道,我只是提出了一些需要注意的可能性。

【讨论】:

  • 谢谢!事实上,使用“-c”标志根本没有调用链接器,这是一个错误。但我尝试不使用 -c 标志(gcc sparse_matrix.c -o sparse_matrix.o -Wall -pedantic -std=c99 -g -O -lm)。但是我对“main”有一个未定义的引用。正如我所说,我只尝试做一个需要来自“libmath”的“sqrt”函数的库“sparse_matrix”。
  • @Alex,检查 C 文件中是否真的有 is main。鉴于您将编译与链接阶段分开,它很可能存在于 another C 文件中。如果您创建一个带有对象的库(没有main),-c 是可行的方法,但引入数学库是在链接期间应该完成的事情,当您的客户需要使用您的东西时:gcc client_stuff.c -lsparse_matrix_lib -lm ....
  • 是的,这就是我想要做的。谢谢,我对库不是那么容易,我想我可以将一个库链接到另一个库。对不起这个相当简单的错误。我刚刚尝试了使用这个库的主程序,并且(现在我明白了)它工作正常(只是在库的编译时而不是在使用我的 lib 的程序的链接阶段添加了“-lm”): ) 再次感谢您这么快的回答!
猜你喜欢
  • 2020-05-20
  • 2020-04-17
  • 2013-04-27
  • 2012-09-20
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多