C 对“pow'”的未定义引用;和"地板"x27 ;;

C 对“pow'”的未定义引用;和"地板"x27 ;;,c,gcc,undefined-reference,C,Gcc,Undefined Reference,我试图用C语言制作一个简单的斐波那契计算器,但在编译gcc时,它告诉我缺少pow和floor函数。怎么了 代码: 您需要使用链接标志-lm进行编译,如下所示: gcc fib.c -lm -o fibo 这将告诉gcc将代码链接到数学库。只需确保在要链接的对象后放置标志 您需要使用链接标志-lm进行编译,如下所示: gcc fib.c -lm -o fibo 这将告诉gcc将代码链接到数学库。只需确保在要链接的对象后放置标志 将-lm添加到链接选项中,因为pow()和floor()是数学库的

我试图用C语言制作一个简单的斐波那契计算器,但在编译
gcc
时,它告诉我缺少pow和floor函数。怎么了

代码:


您需要使用链接标志
-lm
进行编译,如下所示:

gcc fib.c -lm -o fibo

这将告诉gcc将代码链接到数学库。只需确保在要链接的对象后放置标志

您需要使用链接标志
-lm
进行编译,如下所示:

gcc fib.c -lm -o fibo

这将告诉gcc将代码链接到数学库。只需确保在要链接的对象后放置标志

将-lm添加到链接选项中,因为pow()和floor()是数学库的一部分:

gcc fib.c -o fibo -lm

将-lm添加到链接选项中,因为pow()和floor()是数学库的一部分:

gcc fib.c -o fibo -lm

要找到在EclipseIDE中添加-lm的位置真是太可怕了,所以我花了一些时间

如果其他人也使用Edlipse,以下是添加命令的方法:


项目->属性->C/C++构建->设置->GCC C链接器->杂项->链接器标志:在该字段中添加命令-lm

,以找到在Eclipse IDE中添加-lm的位置非常糟糕,所以我花了一些时间

如果其他人也使用Edlipse,以下是添加命令的方法:


项目->属性->C/C++构建->设置->GCC C链接器->杂项->链接器标志:在该字段中,针对Fuzzy提供的答案添加命令-lm

事实上,我不得不做一些稍微不同的事情

项目->属性->C/C++构建->设置->GCC链接器->库


单击绿色的小添加图标,键入m并点击ok。此窗口中的所有内容都自动应用了-l,因为它是一个库。

关于Fuzzy提供的答案:

事实上,我不得不做一些稍微不同的事情

项目->属性->C/C++构建->设置->GCC链接器->库


单击绿色的小添加图标,键入m并点击ok。此窗口中的所有内容都自动应用了-l,因为它是一个库。

为了便于以后阅读此窗口的任何人,您需要对其进行链接,正如Fred所说:

gcc fib.c -lm -o fibo
找到需要链接的库的一个好方法是检查手册页(如果有)。例如,
man-pow
man-floor
都会告诉您:

链接到
-lm


C编程中链接数学库的说明-

为了便于以后阅读,您需要对其进行链接,正如Fred所说:

gcc fib.c -lm -o fibo
找到需要链接的库的一个好方法是检查手册页(如果有)。例如,
man-pow
man-floor
都会告诉您:

链接到
-lm


在C编程中链接数学库的解释-

以上所有答案都不完整,这里的问题在于链接器
ld
而不是编译器
collect2:ld返回1退出状态
。将
fib.c
编译为对象时:

$ gcc -c fib.c
$ nm fib.o
0000000000000028 T fibo
                 U floor
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T main
                 U pow
                 U printf
其中
nm
列出了对象文件中的符号。您可以看到,这是编译时没有错误的,但是
pow
floor
printf
函数有未定义的引用,现在,如果我尝试将其链接到可执行文件:

$ gcc fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status
我得到了与你相似的输出。为了解决这个问题,我需要告诉链接器在哪里查找对
pow
floor
的引用,为此,我将使用链接器
-l
标志和
m
,它来自
libm.so

$ gcc fib.o -lm
$ nm a.out
0000000000201010 B __bss_start
0000000000201010 b completed.7697
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000000620 t deregister_tm_clones
00000000000006b0 t __do_global_dtors_aux
0000000000200da0 t 
__do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200da8 d _DYNAMIC
0000000000201010 D _edata
0000000000201018 B _end
0000000000000722 T fibo
0000000000000804 T _fini
                 U floor@@GLIBC_2.2.5
00000000000006f0 t frame_dummy
0000000000200d98 t __frame_dummy_init_array_entry
00000000000009a4 r __FRAME_END__
0000000000200fa8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000083c r __GNU_EH_FRAME_HDR
0000000000000588 T _init
0000000000200da0 t __init_array_end
0000000000200d98 t __init_array_start
0000000000000810 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000000800 T __libc_csu_fini
0000000000000790 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
00000000000006fa T main
                 U pow@@GLIBC_2.2.5
                 U printf@@GLIBC_2.2.5
0000000000000660 t register_tm_clones
00000000000005f0 T _start
0000000000201010 D __TMC_END__
您现在可以看到,功能
pow
floor
链接到
GLIBC_2.2.5

参数顺序也很重要,除非您的系统默认配置为使用共享库,否则我的系统不会,因此当我发出:

$ gcc -lm fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status

注意对象文件前的
-lm
标志。总之,在所有其他标志和参数之后添加
-lm
标志,这是肯定的。

以上所有答案都不完整,这里的问题在于链接器
ld
而不是编译器
collect2:ld返回1退出状态。将
fib.c
编译为对象时:

$ gcc -c fib.c
$ nm fib.o
0000000000000028 T fibo
                 U floor
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T main
                 U pow
                 U printf
其中
nm
列出了对象文件中的符号。您可以看到,这是编译时没有错误的,但是
pow
floor
printf
函数有未定义的引用,现在,如果我尝试将其链接到可执行文件:

$ gcc fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status
我得到了与你相似的输出。为了解决这个问题,我需要告诉链接器在哪里查找对
pow
floor
的引用,为此,我将使用链接器
-l
标志和
m
,它来自
libm.so

$ gcc fib.o -lm
$ nm a.out
0000000000201010 B __bss_start
0000000000201010 b completed.7697
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000000620 t deregister_tm_clones
00000000000006b0 t __do_global_dtors_aux
0000000000200da0 t 
__do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200da8 d _DYNAMIC
0000000000201010 D _edata
0000000000201018 B _end
0000000000000722 T fibo
0000000000000804 T _fini
                 U floor@@GLIBC_2.2.5
00000000000006f0 t frame_dummy
0000000000200d98 t __frame_dummy_init_array_entry
00000000000009a4 r __FRAME_END__
0000000000200fa8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000083c r __GNU_EH_FRAME_HDR
0000000000000588 T _init
0000000000200da0 t __init_array_end
0000000000200d98 t __init_array_start
0000000000000810 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000000800 T __libc_csu_fini
0000000000000790 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
00000000000006fa T main
                 U pow@@GLIBC_2.2.5
                 U printf@@GLIBC_2.2.5
0000000000000660 t register_tm_clones
00000000000005f0 T _start
0000000000201010 D __TMC_END__
您现在可以看到,功能
pow
floor
链接到
GLIBC_2.2.5

参数顺序也很重要,除非您的系统默认配置为使用共享库,否则我的系统不会,因此当我发出:

$ gcc -lm fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status

注意对象文件前的
-lm
标志。总之,请在所有其他标志和参数之后添加
-lm
标志。

您能解释一下如何计算出在-l之后的字母吗?在/lib或/usr/lib中查找。这些库都被命名为
lib.a
lib.so
-它是您在
-l
后面加上的“”。在本例中,数学库名为
libm.so
,因此我们称之为
-lm
。谢谢!在过去的30分钟里,我一直在谷歌上搜索,这是第一个提到在对象之后链接库的参考。你也可以使用LD_PRELOAD告诉LD runtime linker在进程的内存映射和符号表中包含libm.so,这样这些符号就会被加载,一切都会按照预期工作。谢谢答案。但是有谁能告诉我为什么在代码只有几行的情况下,即使