当我编译这个简短的程序时
#include <math.h>
#include <stdio.h>
int main(void) {
long double ld = logl(1L);
printf("logl = %Lf\n", ld);
}
使用'gcc foo.c'我收到此错误消息
$ gcc foo.c
foo.c: In function ‘main’:
foo.c:5:19: warning: incompatible implicit declaration of built-in function ‘logl’
long double ld = logl(1L);
包含文件math.h包含在/usr/include/math.h
中$ gcc -M foo.c
foo.o: foo.c /usr/include/math.h /usr/include/sys/reent.h \
/usr/include/_ansi.h /usr/include/newlib.h /usr/include/sys/config.h \
....
logl()的原型在math.h中找到
$ grep logl /usr/include/math.h
extern long double logl _PARAMS((long double));
编译错误消息表明编译器无法找到 logl()的原型。
math.h中logl()的定义被这些ifndefs
包围#ifndef _REENT_ONLY
#ifndef __math_6888
...
extern long double logl _PARAMS((long double));
...
#endif /* ! defined (__math_68881) */
#endif /* ! defined (_REENT_ONLY) */
我没有通过gcc的命令行参数定义任何这些符号。 因此,我希望gcc能够找到logl()的原型,但由于某种原因它无法使用。
另外,如果将程序更改为使用log(1)而不是logl(1L),则没有 关于'不兼容的隐式声明'的编译器错误。 gcc能够 在math.h中找到log()但不是logl()。 log()在同一个内部声明 围绕logl()的ifndefs。
我正在使用gcc版本4.9.3的cygwin进行编译。