Почему GCC (MinGW-w64) возвращает «фатальную ошибку: нет входных файлов» при сборке MPFR? - PullRequest
0 голосов
/ 05 декабря 2018

Я не могу определить причину ошибки при попытке собрать MPFR 4.0.1 с MinGW-w64 8.1.0.Я использую msys2 и Windows 10. Результат запуска mingw32-make:

$ 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

Команда, использованная для выполнения настройки, была:

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

Предоставленная мной сборка GMP быласозданный мной, и он прошел все тесты 'make check'.

Попытки исправить Следуя совету Майка, я передал gcc исправленную строку через флаг CC, но получилновая ошибка, поскольку gcc может записывать только в один файл:

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"

Команда все еще не работает, как я теперь получаю эту ошибку:

libtool:   error: you cannot specify '-o' more than once

В отчаянии, ятакже пытался:

  • Откат к MPFR 3.1.6 (версия, «рекомендованная» портом MinGW-w64 здесь: https://github.com/emphasis87/libmpfr-msys2-mingw64);
  • Не использовать скрипт bash и запустить configureнапрямую;
  • Преобразование сценария bash в ANSI вместо UTF-8;
  • Использование Cygwin;

Aaargh.

1 Ответ

0 голосов
/ 05 декабря 2018

В этой командной строке:

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/\"...

мы видим, что первая из этих экранированных кавычек была удалена и заменена другой escape:

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

и что новая неэкранированная кавычка быладобавляется к определению макроса:

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

, создавая таким образом строковый аргумент для gcc, который начинается с "-DLT_OBJDIR=\\.libs/\"... и фактически использует весь остаток командной строки до:

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

тогда как в исходной командной строке мы имеем:

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

С того места, где я сижу, я не могу объяснить причину этого побега / искажения цитаты, но это ответ на вопрос:

Почему GCC (MinGW-w64) возвращает «фатальную ошибку: нет входных файлов» при построении MPFR?

Я предлагаю вам направить свое расследование на это с преимуществом того, чтобы быть парнемна месте.

...