这真的很奇怪:
: josh@josh; wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7.tar.bz2 : josh@josh; tar xvjf ruby-1.8.7.tar.bz2 : josh@josh; cd ruby-1.8.7/ : josh@josh; CFLAGS='-O0 -g -Wall' ./configure --disable-pthread : josh@josh; make gcc -O0 -g -Wall -DRUBY_EXPORT -D_GNU_SOURCE=1 -I. -I. -c array.c [...] gcc -O0 -g -Wall -DRUBY_EXPORT -D_GNU_SOURCE=1 -I. -I. -c math.c math.c: In function ‘domain_check’: math.c:37: error: missing binary operator before token "(" make: *** [math.o] Error 1
果然,math.c无法编译:
: josh@josh; gcc -O0 -g -Wall -DRUBY_EXPORT -D_GNU_SOURCE=1 -I. -I. -c math.c math.c: In function ‘domain_check’: math.c:37: error: missing binary operator before token "("
math.c没有明显的错误:
static void domain_check(x,msg) double x; char *msg; { while(1) { if (errno) { rb_sys_fail(msg); } if (isnan(x)) { #if defined(EDOM) errno = EDOM; #elif define(ERANGE) # <== this is line 37 errno = ERANGE; #endif continue; } break; } }
让我们看看预处理器产生的内容:
: josh@josh; gcc -E -O0 -g -Wall -DRUBY_EXPORT -D_GNU_SOURCE=1 -I. -I. -c math.c >/tmp/math.c math.c:37: error: missing binary operator before token "("
好的,看起来没问题,所以让我们编译它,看看问题出在哪里:
: josh@josh; gcc -O0 -g -Wall -DRUBY_EXPORT -D_GNU_SOURCE=1 -I. -I. -c /tmp/math.c : josh@josh; echo $? 0 : josh@josh; ls -l math.o -rw-r--r-- 1 josh josh 20904 2011-03-04 13:47 math.o
现在我已经将math.c手动编译成math.o,我可以构建ruby.但我仍然想知道世界上到底发生了什么.
有任何想法吗?
解决方法
它应该是“#elif defined(XXX)”