【问题标题】:undefined reference to `sin', even though I use <math.h> and -lm [duplicate]即使我使用 <math.h> 和 -lm [重复],对 `sin' 的未定义引用
【发布时间】:2020-04-17 14:41:06
【问题描述】:

我注意到当我在函数内部使用sin 时,编译器无法识别它,下面是一个示例:

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

float sinus(float a){
    return sin(a);}

int main(int argc, char **argv)
{
    double a = sinus(2);
    printf("%f \n", sin(2));
    printf("%f", a);
    return 0;
}

如果我直接在 main 中使用它可以正常工作,但在用户定义的函数中它会给我这个错误undefined reference to sin

我使用gcc -Wall -lm -lc -lgcc -o "%e" "%f"进行编译。

【问题讨论】:

  • 您要为什么系统/环境构建?添加-lc-lgcc 几乎可以肯定是没有必要的...%e%f 是什么?
  • 我在 ubuntu 中使用 geany,这是 gcc 版本 gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) %e 用于不带 .c 的文件名,%f 用于文件名.c
  • 那么@alk 的评论就是你要找的(他/她应该把它写成答案)。
  • 感谢大家的cmets。把对图书馆的引用放在最后解决了它。祝大家节日快乐!
  • @AnasBELFADIL 见what to do when someone answers。不要发布“谢谢”,只需用复选标记接受正确答案(当 SO 允许您这样做时)。

标签: c linker-errors undefined-reference


【解决方案1】:

对库的引用通常位于命令行的末尾,尤其是在指定源之后

gcc -Wall -o "%e" "%f" -lm 

(指定C库不是必须的,它是隐式链接的)

来自documentation

-l

[...]

在命令的哪个位置编写此选项会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,“foo.o -lz bar.o”在文件 foo.o 之后但在 bar.o 之前搜索库“z”。如果 bar.o 引用了“z”中的函数,则可能不会加载这些函数。

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2012-01-19
    • 2020-05-20
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多