为什么在构建MPFR时GCC(MinGW-w64)返回“致命错误:无输入文件”?

时间:2018-12-04 23:44:33

标签: c mingw mingw-w64 gmp mpfr

当我尝试使用MinGW-w64 8.1.0构建MPFR 4.0.1时,我无法诊断错误的原因。我正在使用msys2和Windows10。运行mingw32-make的结果是:

for( size_t i = 0; i < thisgame->size; i++ ){
  printf("%d ", *thisgame->layout[i]);
  if(i == 0)
    continue;
  else if( (i+1) % 10 == 0 )
    printf("\n");
}

用于执行配置的命令为:

$ make
Making all in doc
make[1]: Entering directory 'C:/development-personal-builds/mpfr-4.0.1/build-1/doc'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory 'C:/development-personal-builds/mpfr-4.0.1/build-1/doc'
Making all in src
make[1]: Entering directory 'C:/development-personal-builds/mpfr-4.0.1/build-1/src'
C:/development-tools/mingw-w64-8.1.0/mingw64/bin/make  all-am
make[2]: Entering directory 'C:/development-personal-builds/mpfr-4.0.1/build-1/src'
C:/development-tools/msys2/usr/bin/sh.exe ../libtool  --tag=CC   --mode=compile gcc -DMPFR_WANT_ASSERT=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_DOUBLE_IEEE_LITTLE_ENDIAN=1 -DHAVE_LITTLE_ENDIAN=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_LOCALE_H=1 -DHAVE_WCHAR_H=1 -DHAVE_STDARG=1 -DHAVE_SYS_TIME_H=1 -DHAVE_STRUCT_LCONV_DECIMAL_POINT=1 -DHAVE_STRUCT_LCONV_THOUSANDS_SEP=1 -DHAVE_VA_COPY=1 -DHAVE_SETLOCALE=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_SIGNAL=1 -DHAVE_LONG_LONG=1 -DHAVE_INTMAX_T=1 -DMPFR_HAVE_INTMAX_MAX=1 -DMPFR_PRINTF_MAXLM=\"ll\" -DMPFR_HAVE_NORETURN=1 -DMPFR_HAVE_BUILTIN_UNREACHABLE=1 -DMPFR_HAVE_CONSTRUCTOR_ATTR=1 -DHAVE_PTHREAD_PRIO_INHERIT=1 -DHAVE_PTHREAD=1 -DMPFR_HAVE_FESETROUND=1 -DHAVE_DENORMS=1 -DHAVE_DENORMS_FLT=1 -DHAVE_SIGNEDZ=1 -DHAVE_ROUND=1 -DHAVE_TRUNC=1 -DHAVE_FLOOR=1 -DHAVE_CEIL=1 -DHAVE_NEARBYINT=1 -DHAVE_LDOUBLE_IEEE_EXT_LITTLE=1 -DMPFR_USE_THREAD_SAFE=1 -DMPFR_USE_C11_THREAD_SAFE=1 -DMPFR_WANT_DECIMAL_FLOATS=1 -DMPFR_WANT_FLOAT128=1 -DMPFR_USE_STATIC_ASSERT=1 -DHAVE_CLOCK_GETTIME=1 -DHAVE_ATTRIBUTE_MODE=1 -DNPRINTF_J=1 -DNPRINTF_L=1 -DNPRINTF_T=1 -DHAVE___GMPN_SBPI1_DIVAPPR_Q=1 -DHAVE___GMPN_INVERT_LIMB=1 -DHAVE___GMPN_RSBLSH_N=1 -DMPFR_LONG_WITHIN_LIMB=1 -I. -I../../src/src   -IC:/development-personal-builds/gmp-6.1.2/build-1/include  -Wall -Wmissing-prototypes -Wpointer-arith -O2 -pedantic -fomit-frame-pointer -m64 -mtune=k8 -march=k8 -MT exceptions.lo -MD -MP -MF .deps/exceptions.Tpo -c -o exceptions.lo ../../src/src/exceptions.c
libtool: compile:  gcc -DMPFR_WANT_ASSERT=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 "-DLT_OBJDIR=\\.libs/\" -DHAVE_DOUBLE_IEEE_LITTLE_ENDIAN=1 -DHAVE_LITTLE_ENDIAN=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_LOCALE_H=1 -DHAVE_WCHAR_H=1 -DHAVE_STDARG=1 -DHAVE_SYS_TIME_H=1 -DHAVE_STRUCT_LCONV_DECIMAL_POINT=1 -DHAVE_STRUCT_LCONV_THOUSANDS_SEP=1 -DHAVE_VA_COPY=1 -DHAVE_SETLOCALE=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_SIGNAL=1 -DHAVE_LONG_LONG=1 -DHAVE_INTMAX_T=1 -DMPFR_HAVE_INTMAX_MAX=1 -DMPFR_PRINTF_MAXLM=\"ll\" -DMPFR_HAVE_NORETURN=1 -DMPFR_HAVE_BUILTIN_UNREACHABLE=1 -DMPFR_HAVE_CONSTRUCTOR_ATTR=1 -DHAVE_PTHREAD_PRIO_INHERIT=1 -DHAVE_PTHREAD=1 -DMPFR_HAVE_FESETROUND=1 -DHAVE_DENORMS=1 -DHAVE_DENORMS_FLT=1 -DHAVE_SIGNEDZ=1 -DHAVE_ROUND=1 -DHAVE_TRUNC=1 -DHAVE_FLOOR=1 -DHAVE_CEIL=1 -DHAVE_NEARBYINT=1 -DHAVE_LDOUBLE_IEEE_EXT_LITTLE=1 -DMPFR_USE_THREAD_SAFE=1 -DMPFR_USE_C11_THREAD_SAFE=1 -DMPFR_WANT_DECIMAL_FLOATS=1 -DMPFR_WANT_FLOAT128=1 -DMPFR_USE_STATIC_ASSERT=1 -DHAVE_CLOCK_GETTIME=1 -DHAVE_ATTRIBUTE_MODE=1 -DNPRINTF_J=1 -DNPRINTF_L=1 -DNPRINTF_T=1 -DHAVE___GMPN_SBPI1_DIVAPPR_Q=1 -DHAVE___GMPN_INVERT_LIMB=1 -DHAVE___GMPN_RSBLSH_N=1 -DMPFR_LONG_WITHIN_LIMB=1 -I. -I../../src/src -IC:/development-personal-builds/gmp-6.1.2/build-1/include -Wall -Wmissing-prototypes -Wpointer-arith -O2 -pedantic -fomit-frame-pointer -m64 -mtune=k8 -march=k8 -MT exceptions.lo -MD -MP -MF .deps/exceptions.Tpo -c -o exceptions.lo ../../src/src/exceptions.c"  -DDLL_EXPORT -DPIC -o .libs/exceptions.o
gcc.exe: fatal error: no input files
compilation terminated.
make[2]: *** [Makefile:807: exceptions.lo] Error 1
make[2]: Leaving directory 'C:/development-personal-builds/mpfr-4.0.1/build-1/src'
make[1]: *** [Makefile:476: all] Error 2
make[1]: Leaving directory 'C:/development-personal-builds/mpfr-4.0.1/build-1/src'
make: *** [Makefile:498: all-recursive] Error 1

我提供的GMP版本是我自己构建的,并且通过了所有“ make check”测试。

尝试修复 按照Mike的建议,我已经通过CC标志向gcc提供了更正的字符串,但是由于gcc只能写入一个文件,因此出现了新错误:

cd build-1
../src/configure \
--prefix=C:/development-personal-builds/mpfr-4.0.1/build-1 \
--build=x86_64-w64-mingw32 \
--enable-assert \
--enable-shared=yes \
--enable-static=no \
--with-gmp=C:/development-personal-builds/gmp-6.1.2/build-1

命令仍然混乱,因为我现在收到此错误:

CC="--mode=compile gcc -DMPFR_WANT_ASSERT=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_DOUBLE_IEEE_LITTLE_ENDIAN=1 -DHAVE_LITTLE_ENDIAN=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_LOCALE_H=1 -DHAVE_WCHAR_H=1 -DHAVE_STDARG=1 -DHAVE_SYS_TIME_H=1 -DHAVE_STRUCT_LCONV_DECIMAL_POINT=1 -DHAVE_STRUCT_LCONV_THOUSANDS_SEP=1 -DHAVE_VA_COPY=1 -DHAVE_SETLOCALE=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_SIGNAL=1 -DHAVE_LONG_LONG=1 -DHAVE_INTMAX_T=1 -DMPFR_HAVE_INTMAX_MAX=1 -DMPFR_PRINTF_MAXLM=\"ll\" -DMPFR_HAVE_NORETURN=1 -DMPFR_HAVE_BUILTIN_UNREACHABLE=1 -DMPFR_HAVE_CONSTRUCTOR_ATTR=1 -DHAVE_PTHREAD_PRIO_INHERIT=1 -DHAVE_PTHREAD=1 -DMPFR_HAVE_FESETROUND=1 -DHAVE_DENORMS=1 -DHAVE_DENORMS_FLT=1 -DHAVE_SIGNEDZ=1 -DHAVE_ROUND=1 -DHAVE_TRUNC=1 -DHAVE_FLOOR=1 -DHAVE_CEIL=1 -DHAVE_NEARBYINT=1 -DHAVE_LDOUBLE_IEEE_EXT_LITTLE=1 -DMPFR_USE_THREAD_SAFE=1 -DMPFR_USE_C11_THREAD_SAFE=1 -DMPFR_WANT_DECIMAL_FLOATS=1 -DMPFR_WANT_FLOAT128=1 -DMPFR_USE_STATIC_ASSERT=1 -DHAVE_CLOCK_GETTIME=1 -DHAVE_ATTRIBUTE_MODE=1 -DNPRINTF_J=1 -DNPRINTF_L=1 -DNPRINTF_T=1 -DHAVE___GMPN_SBPI1_DIVAPPR_Q=1 -DHAVE___GMPN_INVERT_LIMB=1 -DHAVE___GMPN_RSBLSH_N=1 -DMPFR_LONG_WITHIN_LIMB=1 -I. -I../../src/src -IC:/development-personal-builds/gmp-6.1.2/build-1/include -Wall -Wmissing-prototypes -Wpointer-arith -O2 -pedantic -fomit-frame-pointer -m64 -mtune=k8 -march=k8 -MT exceptions.lo -MD -MP -MF .deps/exceptions.Tpo -c -o exceptions.lo ../../src/src/exceptions.c -DDLL_EXPORT -DPIC -o .libs/exceptions.o"

出于绝望,我也尝试过:

Aaargh。

2 个答案:

答案 0 :(得分:1)

在此命令行中:

C:/development-tools/msys2/usr/bin/sh.exe ../libtool  --tag=CC   --mode=compile \
gcc -DMPFR_WANT_ASSERT=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DLT_OBJDIR=\".libs/\"...

我们看到在-DLT_OBJDIR=\".libs/\"中,有一些引号引起来,这些引号被转义了。但是在libtool的诊断中:

libtool: compile:  gcc -DMPFR_WANT_ASSERT=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 "-DLT_OBJDIR=\\.libs/\"...

我们看到这些转义引号中的第一个已被删除并替换为另一个转义:

\".libs/\"  <- before
\\.libs/\"  <- after

并且在宏定义之前已添加了一个新的未转义的引号:

 -DLT_OBJDIR=\".libs/\" <- before
"-DLT_OBJDIR=\\.libs/\" <- after

因此为以"-DLT_OBJDIR=\\.libs/\"...开始的gcc创建带引号的字符串参数 并且实际上消耗了命令行的所有其余部分,直到:

../../src/src/exceptions.c"

在原始命令行中,我们有:

../../src/src/exceptions.c

从我坐着的地方,我无法解释这种转义/引号损坏的原因, 但这是问题的答案:

  

为什么在构建MPFR时GCC(MinGW-w64)返回“致命错误:无输入文件”?

我建议您直接进行调查,以当场为佳。

答案 1 :(得分:0)

请参阅Mike关于发生这种情况的答案。


构建PortAudio时,我遇到了同样的事情,但是可以使用CMake克服它:

cd portaudio
cmake -S . -B build/MinGW -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=.
cmake --build build/MinGW -j $(nproc) --target install