我正在阅读一本名为“GCC入门”的书,需要进行澄清。书中指出下面的代码会导致错误,但是当我编译时,它完美地构建和运行:
#include <math.h>
#include <stdio.h>
int main (void) {
double x = sqrt (2.0);
printf ("The square root of 2.0 is %f\n", x);
return 0;
}
我引用自书中的一段内容:“仅从这个源文件创建可执行文件会导致编译器在链接阶段报错:”
$ gcc -Wall calc.c -o calc
/tmp/ccbR6Ojm.o: In function `main':
/tmp/ccbR6Ojm.o(.text+0x19): undefined reference
to `sqrt'
该书提供的解决方案是,您应该按照以下方式包含数学库“libm.a”的路径:
$ gcc -Wall calc.c /usr/lib/libm.a -o calc
很不方便在程序中指定我们使用的内置库的路径。我能理解添加到自己自定义库的路径的原因,但是更现代的gcc版本有什么改变,以至于我们不需要包含libm.a的路径呢?虽然这本书已经相当老了(2004年出版),但是libm.a已经内置于gcc中了。 *更新* 我注意到taskinoor给出的答案展示了更新后的代码,如果sqrt()函数接收到的值在编译时未知,则需要使用-lm标志。
我使用VS学习C / C ++,但现在我的目标是学习和使用gcc。我拥有Visual Studio 2013,但VS编译器/链接器似乎并不那么挑剔。例如,我能够编译几乎任何简单的程序而无需指定神秘的编译器标志。
我正在使用附带于KUBUNTU 16.04.1的gcc版本5.4进行学习。
$ gcc -Wall calc.c -lm -o calc
等同于原始命令... - J. Allan