2016-09-15 4 views
1

Я пытаюсь перекрестно скомпилировать фрагмент кода, который использует float.h для установки некоторых размеров FPU.float.h не найден или не включен правильно при использовании mingw-w64

Конкретный фрагмент кода, который требует именно:

#ifdef SINGLE 
    _control87(_PC_24, _MCW_PC); /* Set FPU control word for single precision. */ 
#else /* not SINGLE */ 
    _control87(_PC_53, _MCW_PC); /* Set FPU control word for double precision. */ 
#endif /* not SINGLE */ 

Когда я компилирую, однако, я получаю ошибку

/home/rcrozier/src/xfemm-hg/mfemm/../cfemm/fmesher/triangle.c:4922:14: error: '_PC_53' undeclared (first use in this function) 
    _control87(_PC_53, _MCW_PC); /* Set FPU control word for double precision. */ 

Другой человек объясняет, что, кажется, та же проблема, в более подробно here. Существует также очень похожая проблема, описанная в (довольно старой) теме here. В случае, если это уместно, я использую mingw-w64, а через M Cross Environment

Что именно проблема с float.h в этом случае, и есть обходной путь?

EDIT: Полный вывод из GCC

Using built-in specs. 
COLLECT_GCC=/opt/mxe/usr/bin/x86_64-w64-mingw32.shared-gcc 
Target: x86_64-w64-mingw32.shared 
Configured with: /opt/mxe/tmp-gcc-x86_64-w64-mingw32.shared/gcc-4.9.4/configure --target=x86_64-w64-mingw32.shared --build=x86_64-unknown-linux-gnu --prefix=/opt/mxe/usr --libdir=/opt/mxe/usr/lib --enable-languages=c,c++,objc,fortran --enable-version-specific-runtime-libs --with-gcc --with-gnu-ld --with-gnu-as --disable-nls --disable-multilib --without-x --disable-win32-registry --enable-threads=win32 --enable-libgomp --with-gmp=/opt/mxe/usr/x86_64-unknown-linux-gnu --with-isl=/opt/mxe/usr/x86_64-unknown-linux-gnu --with-mpc=/opt/mxe/usr/x86_64-unknown-linux-gnu --with-mpfr=/opt/mxe/usr/x86_64-unknown-linux-gnu --with-cloog=/opt/mxe/usr/x86_64-unknown-linux-gnu --with-as=/opt/mxe/usr/bin/x86_64-w64-mingw32.shared-as --with-ld=/opt/mxe/usr/bin/x86_64-w64-mingw32.shared-ld --with-nm=/opt/mxe/usr/bin/x86_64-w64-mingw32.shared-nm 
Thread model: win32 
gcc version 4.9.4 (GCC) 
COLLECT_GCC_OPTIONS='-c' '-I' '../cfemm/fmesher' '-I' '../cfemm/libfemm' '-I' '../cfemm/libfemm/liblua' '-I' '/usr/local/MATLAB/R2015a/extern/include' '-I' '/usr/local/MATLAB/R2015a/simulink/include' '-D' 'MATLAB_MEX_FILE' '-std=c99' '-D' '_GNU_SOURCE' '-fexceptions' '-fPIC' '-fno-omit-frame-pointer' '-pthread' '-v' '-fpermissive' '-D' 'CPU86' '-D' 'MX_COMPAT_32' '-O' '-D' 'NDEBUG' '-o' '/home/rcrozier/src/xfemm-hg/mfemm/../cfemm/fmesher/triangle.o' '-mtune=generic' '-march=x86-64' 
/opt/mxe/usr/libexec/gcc/x86_64-w64-mingw32.shared/4.9.4/cc1 -quiet -v -I ../cfemm/fmesher -I ../cfemm/libfemm -I ../cfemm/libfemm/liblua -I /usr/local/MATLAB/R2015a/extern/include -I /usr/local/MATLAB/R2015a/simulink/include -D_REENTRANT -U_REENTRANT -D MATLAB_MEX_FILE -D _GNU_SOURCE -D CPU86 -D MX_COMPAT_32 -D NDEBUG /home/rcrozier/src/xfemm-hg/mfemm/../cfemm/fmesher/triangle.c -quiet -dumpbase triangle.c -mtune=generic -march=x86-64 -auxbase-strip /home/rcrozier/src/xfemm-hg/mfemm/../cfemm/fmesher/triangle.o -O -std=c99 -version -fexceptions -fPIC -fno-omit-frame-pointer -fpermissive -o /tmp/ccMkwwWD.s 
cc1: warning: command line option '-fpermissive' is valid for C++/ObjC++ but not for C 
GNU C (GCC) version 4.9.4 (x86_64-w64-mingw32.shared) 
    compiled by GNU C version 4.8.4, GMP version 6.1.1, MPFR version 3.1.4, MPC version 1.0.2 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
ignoring nonexistent directory "/opt/mxe/usr/lib/gcc/x86_64-w64-mingw32.shared/4.9.4/../../../../x86_64-w64-mingw32.shared/sys-include" 
#include "..." search starts here: 
#include <...> search starts here: 
../cfemm/fmesher 
../cfemm/libfemm 
../cfemm/libfemm/liblua 
/usr/local/MATLAB/R2015a/extern/include 
/usr/local/MATLAB/R2015a/simulink/include 
/opt/mxe/usr/lib/gcc/x86_64-w64-mingw32.shared/4.9.4/include 
/opt/mxe/usr/lib/gcc/x86_64-w64-mingw32.shared/4.9.4/include-fixed 
/opt/mxe/usr/lib/gcc/x86_64-w64-mingw32.shared/4.9.4/../../../../x86_64-w64-mingw32.shared/include 
End of search list. 

EDIT: подробнее

Я также получить тот же результат, если я использую полный путь к каталогу в mingw-w64float.h как так:

//#include <float.h> 
#include "/opt/mxe/usr/x86_64-w64-mingw32.static/include/float.h" 

EDIT Дополнительная информация о кодовой структуре

Чтобы предоставить дополнительную информацию, я на самом деле собираю библиотеку C (заголовок и файл C), где объявление функции, которую я использую, включено с использованием extern C. Фактическое объявление из заголовка файла приведен ниже:

#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef ANSI_DECLARATORS 
int triangulate(char *, struct triangulateio *, struct triangulateio *, 
       struct triangulateio *, int (*TriMessage)(const char * format, ...)); 
void trifree(VOID *memptr); 
#else /* not ANSI_DECLARATORS */ 
int triangulate(); 
void trifree(); 
#endif /* not ANSI_DECLARATORS */ 

#ifdef __cplusplus 
} 
#endif 

Фактическая библиотека я использую Triangle. Float.h включают в triangle.c, и выглядит следующим образом:

#ifdef CPU86 
//#include <float.h> 
#include "/opt/mxe/usr/x86_64-w64-mingw32.static/include/float.h" 
#endif /* CPU86 */ 
#ifdef LINUX 
#include <fpu_control.h> 
#endif /* LINUX */ 

Где вы определяете CPU86 или LINUX во время компиляции. Для кросс-сборки я определяю CPU86.

+0

Правильно ли я вас понимаю? Вы ожидаете, что float.h определит _PC_53 что-нибудь? ** Почему? ** –

+0

Это то, что указал мой поисковик, не так ли? Вы знаете реальную проблему? – crobar

+0

No: http://en.cppreference.com/w/cpp/header/cfloat Реальная проблема трудно сказать, но, вероятно, проблема с конфигурацией. –

ответ

0

OK, после некоторого поиска вокруг я нашел это в triangle.c:

/* On some machines, my exact arithmetic routines might be defeated by the */ 
/* use of internal extended precision floating-point registers. The best */ 
/* way to solve this problem is to set the floating-point registers to use */ 
/* single or double precision internally. On 80x86 processors, this may */ 
/* be accomplished by setting the CPU86 symbol for the Microsoft C   */ 
/* compiler, or the LINUX symbol for the gcc compiler running on Linux. */ 
/*                   */ 

Обратите внимание, что он говорит: "На 80x86 процессорах". Хост, который вы компилируете для - windows 64 bit (x86_64) - не соответствует этому.

Это дополнительно подтверждается official documentation from Microsoft about the extension, который используется в библиотеке, которую вы пытаетесь скомпилировать:

Маска

_MCW_PC (контроль точности)

(Не поддерживается на ARM или x64 платформ.)

[..]

_PC_24 (24 бита)

_PC_53 (53 бит)

_PC_64 (64 бит)

[..]

Таким образом, я думаю, вам нужно настроить свою сборку по-другому, возможно, не определяя CPU86. Хотя я не знаю, действительно ли это решает вашу проблему или просто приводит к неправильным результатам. Ведь ... эта библиотека даже портирована на 64 бит?

+0

Вы делаете хороший момент, но теперь у меня есть возможность дважды проверить, и я могу подтвердить, что тот же код компилируется и запускается изначально на Windows, используя компилятор mingw-w64 (в частности, версию в TDM-GCC 4.9.2). Так что, пока об этом беспокоиться, я не думаю, что это проблема. Некоторое время назад я действительно выслал оригинал автору об этом, но он так и не ответил. Я могу определенно подтвердить, что он компилируется на 64-битной Linux и без проблем решает много проблем. – crobar

+0

У меня также есть возможность проверить triangle.c, а текст справки в начале конкретно упоминает 64-битные архитектуры (он упоминает DEC Alpha в контексте рекомендации о том, использовать ли одиночную двойную точность), поэтому я думаю в принципе «треугольник» должен работать на 64 бит, и практика показывает, что это так. – crobar

+0

Хм ... и в этих рабочих сборках существует ли «CPU86»? Чтение файла readme, я просто оставил бы его (а также 'LINUX') неопределенным. Можете ли вы попробовать это? –

 Смежные вопросы

  • Нет связанных вопросов^_^