对于以下C源代码:
#include <math.h>
int main(void)
{
double x;
x = log(0.0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译时gcc -lm,我得到:
/tmp/ccxxANVH.o: In function `main':
a.c:(.text+0xd): undefined reference to `log'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
但是,如果我替换log(0.0)为log(10.0),那么它可以成功编译.
我不太明白这一点,因为无论它们是否具有数学意义,它们都应该编译 - 没有语法错误.有人能解释一下吗?
以防万一,我的gcc -v输出:
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 …Run Code Online (Sandbox Code Playgroud) 这是一个概述我的问题的最小例子
test.c的:
#include <stdio.h>
#include <math.h>
main ()
{
fmod ( 3, 2 );
}
Run Code Online (Sandbox Code Playgroud)
这是我要编译的命令 test.c
gcc -lm test.c -o test
Run Code Online (Sandbox Code Playgroud)
这是我发出上述命令时得到的输出
/tmp/ccQmRk99.o: In function `main':
test.c:(.text+0x3e): undefined reference to `fmod'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
如果相反,我会使用相同的输出cc.我使用的是以下版本的gcc
gcc-4.6.real (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Run Code Online (Sandbox Code Playgroud)
我的程序无法编译的任何想法?
这是函数指针程序:demo.c
#include <stdio.h>
#include <math.h>
void tabulate(double (*f)(double), double first, double last, double incr);
int main(void) {
double final, increment, initial;
printf("Enter initial value: ");
scanf("%lf", &initial);
printf("Enter final value: ");
scanf("%lf", &final);
printf("Enter increment: ");
scanf("%lf", &increment);
printf("\n x cos(x)"
"\n ------- -------\n");
tabulate(cos, initial, final, increment);
return 0;
}
void tabulate(double (*f)(double), double first, double last, double incr) {
double x;
int i, num_intervals;
num_intervals = ceil((last - first)/incr);
for(i=0; i<=num_intervals; i++) {
x = first + i …Run Code Online (Sandbox Code Playgroud)