在C语言中使用pow()函数会抛出未定义的引用错误。

44

为什么以下这段 C 代码可以正常工作:

int res = pow(2, 3);
printf("%d\n", res);

而这另一个为什么不行呢?

int a = 2;
int b = 3;

int res = pow(a, b);
printf("%d\n", res);

即使我尝试

double a = 2;
double b = 3;

double res = pow(a, b);
printf("%f\n", res);

我遇到了

undefined reference to `pow'

这是什么问题?


一个完整的代码片段会很有帮助... - Oliver Charlesworth
你是否包含了math.h库? - Pete Kirkham
我包含了math.h库,是的。第一个代码片段可以正常工作并输出预期结果。另外两个则会出现“undefined reference to 'pow'”的错误提示。 - devoured elysium
1
你是否通过向gcc/g++提供-lm开关来链接数学库? - swatkat
你是否在使用像math.h这样的库进行#include - Michael Dorst
显示剩余3条评论
5个回答

66

当它起作用时,那是因为计算是由编译器本身完成的(并被包含在二进制文件中就像你手动写出来一样)

printf("8\n");

当它无法工作时,是因为pow函数包含在数学库中,并且默认情况下该数学库未与您的二进制文件链接。
如果要链接数学库,则使用以下方法(假设您的编译器是gcc):

gcc ... -lm ...

对于其他编译器,应该是相同的 :)
但请阅读文档


4
没错!GCC使用MPFR。这里有一些信息:http://gcc.gnu.org/gcc-4.3/changes.html#mpfropts - swatkat
MPFR!哇!:) 当我正尝试着做同样的事情时,完全震惊了我,简直不敢相信我所看到的。 - Deqing

18

undefined reference to 'pow'听起来像是一个链接器错误。即使你包含了函数pow(通过包含<math.h>),但你没有链接数学库。

使用gcc时,使用-lm命令行参数来链接数学库。


11
请注意,相同的答案是在不到1分钟的时间内发布的。这可能有助于解释为什么会这样。 - Lucas

3

使用方法如下

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

int main(void)
{
  for(int i = 1; i < 5; i++)
     printf("pow(3.2, %d) = %lf\n", i, pow(3.2, i));  
  return 0;
}

Output:

pow(3.2, 1) = 3.200000


0
如果您使用CMake(CMakeLists.txt)工具,请在"CMakeLists.txt"的末尾添加以下内容Esmaeill的建议target_link_libraries( <您的项目名称> <其他静态/共享库> m)。其他库是可选的。
例如,整个"CMakeLists.txt":
# ----- 1. Runtime environment
cmake_minimum_required(VERSION 3.14.0)
project( test_libs )

# ----- 2. Debugging
# for debugging with gdb in Terminal
set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")

# ----- 3. Global variable

# ----- 4. Software library
set( includes /usr/local/include/libxml2 )
include_directories( ${includes} )

# ----- 3. Static and shared library
# Static (A file)
set( libs_static libxml2.a )
link_directories( /usr/local/lib )

# Shared (SO file)
set( libs_shared libxml2.so )
link_directories ( /usr/local/lib )

# ----- 4. File to compile

set( sources test_compiler.c )
add_executable( test_libs ${sources} )
# This is for math.h tool: "-l m" which calling "libm.so"
target_link_libraries( test_libs ${libs_static} ${libs_shared} m)

“m”在命令行输入中与“-l m”相同,它被称为“libm.so”文件,是从math.h(和math.c,如果有的话)生成的共享库。这里是一个关于如何使用静态和共享库的网页链接

-6
“undefined reference to `pow'”是因为对于任何数字的幂运算,指数必须是整数值。
pow(x,y)
where, x must be real and y must be a whole number

1
我知道这很旧,但是只是提一下,这不正确,pow()需要两个double参数。;) - Pascal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接