- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读一本关于 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/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!