gpt4 book ai didi

c - 我在我的 C 程序中使用了 pow() 函数,但没有链接到 -lm 它仍然有效。为什么?

转载 作者:太空狗 更新时间:2023-10-29 15:49:10 26 4
gpt4 key购买 nike

我正在阅读一本关于 GCC 的书。它说对于任何 C 程序,默认情况下仅链接标准库。由于 pow() 不在标准库中,我将不得不使用 -lm 标志链接到它。但是,当我编译时,我只是使用:

gcc hello.c -o hello

它仍然有效..

还有另一个类似的问题,书中还说如果你的 C 程序中有 printf("%f\n", 4); 并且如果你编译时没有 - Wall 选项,不会发出警告。但是,我尝试在没有 -Wall 选项的情况下编译它,但我仍然收到警告:

hello.c:6:2: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat]

这是为什么?这本书说我必须提供 -lm-Wall 才能编译我的程序并得到警告,但我没有使用它们中的任何一个,但我仍然得到了我的程序编译并得到警告?

谢谢!

最佳答案

基于一些实验的更多信息。

考虑这个程序:

#include <stdio.h>
#include <math.h>
int main(void) {
#ifdef CONSTANT
double x = pow(2.0, 10.0);
#else
double expon = 10.0;
double x = pow(2.0, expon);
#endif
printf("x = %f\n", x);
return 0;
}

在 Ubuntu 上,当我编译它时

$ gcc c.c -o c

它提示对 pow 的 undefined reference ;添加 -lm 更正它。

但是这个:

$ gcc -DCONSTANT c.c -o c

编译和链接没有错误,将 pow() 调用替换为常量 1024.0。但是这个:

$ gcc -fno-builtin -DCONSTANT c.c -o c

再次提示对 pow 的 undefined reference 。

结论:只有在编译时可以确定结果时,gcc 才会使用内置的pow 实现。否则它会生成对 pow() 函数的显式调用,该函数需要使用 -lm 进行链接。

另请注意,这取决于 C 库的组织方式(该库是单独提供的;它不是 gcc 的一部分)。在 Cygwin 上,它使用 newlib而不是 glibc在 Ubuntu 上使用,不需要 -lm 选项;显然,数学例程是标准库的组成部分,而不是单独提供。 (Cygwin 上的 gcc 仍然接受 -lm 选项。)

关于c - 我在我的 C 程序中使用了 pow() 函数,但没有链接到 -lm 它仍然有效。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11380744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com