【发布时间】:2014-08-09 06:45:56
【问题描述】:
对于以下C源代码:
#include <math.h>
int main(void)
{
double x;
x = log(0.0);
return 0;
}
当我使用gcc -lm 编译时,我得到:
/tmp/ccxxANVH.o: In function `main':
a.c:(.text+0xd): undefined reference to `log'
collect2: error: ld returned 1 exit status
但是,如果我将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 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
请注意,这个问题是关于常量折叠的,但 suggested duplicate question 是关于缺少链接库的。
【问题讨论】:
-
这可能与不断传播有关,而不是指定
-lm。 -
@Cornstalks 确实,应该在源文件之后指定
-lm。 -
我不同意您的前提,即应该编译未定义的数学表达式。由于 log(0) 是未定义的/单数的,它在程序中的存在只能是编程错误的结果。我没想到编译器会捕捉到这一点,但考虑到它具有功能,而不是缺陷这一事实。
-
@gdalya 它应该返回 -Inf,而不是未定义。见here
-
@LưuVĩnhPhúc 这是两个不同的问题。在最后一行查看我的编辑。
标签: c gcc math.h constantfolding