在编译一个因为使用了pow()函数而调用了math.h库的C源代码时,报错:
编译命令如下:gcc chapterfourtwo.c -o chapterfourtwo.o
编译后报错:
/tmp/cc3OVwjO.o: In function `main':
chapterfourtwo.c:(.text+0xa6): undefined reference to `pow'
chapterfourtwo.c:(.text+0xed): undefined reference to `pow'
collect2: error: ld returned 1 exit status
改进方案:gcc chapterfourtwo.c -o chapterfourtwo.o -lm
编译成功
原因如下:
使用math.h中声明的库函数还有一点特殊之处,gcc命令行必须加-lm选项,因为数学函数位于libm.so库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。本书用到的大部分库函数(例如printf)位于libc.so库文件中,使用libc.so中的库函数在编译时不需要加-lc选项,当然加了也不算错,因为这个选项是gcc的默认选项。
C标准主要由两部分组成,一部分描述C的语法,另一部分描述C标准库。C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型 声明和宏定义。要在一个平台上支持C语言,不仅要实现C编译器,还要实现