rob*_*ntw 90 c math linker-errors undefined-reference
我有以下代码(根据这个问题的基础知识):
#include<stdio.h>
#include<math.h>
double f1(double x)
{
double res = sin(x);
return 0;
}
/* The main function */
int main(void)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当gcc test.c我编译它时,我得到以下错误,我无法解决原因:
/tmp/ccOF5bis.o: In function `f1':
test2.c:(.text+0x13): undefined reference to `sin'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
但是,我编写了各种sin从main函数内部调用的测试程序,并且这些程序完美地工作.我必须在这里做一些明显错误的事 - 但它是什么?
Edw*_*uck 110
您已经使用对正确的math.h头文件的引用编译了代码,但是当您尝试链接它时,您忘记了包含数学库的选项.因此,您可以编译.o对象文件,但不能构建可执行文件.
正如Paul已经提到-lm的,在您尝试生成可执行文件的步骤中添加" "以连接数学库.
为什么
sin()在<math.h>,我们需要-lm选项明确; 但是,不是printf()在<stdio.h>?
因为这两个函数都是作为"单一UNIX规范"的一部分实现的.该标准的历史很有意思,并且有许多名称(IEEE Std 1003.1,X/Open Portability Guide,POSIX,Spec 1170).
该标准专门从"标准C数学库"例程(第277页)中分离出"标准C库"例程.相关段落复制如下:
标准C库
自动搜索标准C库
cc以解析外部引用.除了Math Routines之外,该库支持第1卷中定义的Base System的所有接口.标准C数学图书馆
此库支持基本系统数学例程,如第1卷中所定义.该
cc选项-lm用于搜索此库.
这种分离背后的原因受到许多因素的影响:
决定投入-lm不同图书馆的压力可能包括但不限于:
sin()并将其放入自定义构建的库中).在任何情况下,它现在都是标准的一部分,不能自动包含在C语言中,这就是你必须添加的原因-lm.
小智 62
无论如何我添加了-lm的问题
gcc -Wall -lm mtest.c -o mtest.o
mtest.c: In function 'f1':
mtest.c:6:12: warning: unused variable 'res' [-Wunused-variable]
/tmp/cc925Nmf.o: In function `f1':
mtest.c:(.text+0x19): undefined reference to `sin'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我最近发现如果你第一次指定-lm它就不起作用.订单很重要:
gcc mtest.c -o mtest.o -lm
Run Code Online (Sandbox Code Playgroud)
只是链接没有问题
所以你必须在之后指定库.