fread с fopen64 под MinGW64 убивает процесс

Я создаю расширение библиотеки x64 python c из x86.

Я обнаружил, что fread с открытием указателя файла fopen64 убил процесс python из-за ошибки APPCRASHof ntdll.dll. Этого не происходит при сборке x86 и не происходит, если указатель файла открывается с помощью fopen.

Во-первых, я подумал, что это произошло из-за ошибки Windows, упомянутой здесь. Но это не помогло.

Есть ли какая-нибудь хорошая практика, чтобы избежать этой проблемы? Я подумываю сделать определение, чтобы выбрать функцию открытия файла ведьмы, чтобы она могла работать как на x64, так и на x86, но у меня нет никаких замечательных идей для этого.

Моя среда

  • Windows 7 x64
  • Python 2.7.10 x64
  • Numpy 1.11.0
  • MinGW64

person fx-kirin    schedule 13.06.2016    source источник
comment
Похоже, fopen64 - это просто оболочка для все равно fopen. Так что вам, вероятно, следует просто использовать fopen.   -  person Harry Johnston    schedule 14.06.2016
comment
Да, я уже проверял включаемый файл. Но ошибка произошла с fopen64, а не с fopen.   -  person fx-kirin    schedule 14.06.2016
comment
Фактическая проблема, скорее всего, в другом, повреждении памяти или подобном. Но я хочу сказать, что, насколько я могу судить, использование fopen64 ничего не дает, так почему бы просто не использовать fopen?   -  person Harry Johnston    schedule 14.06.2016
comment
Спасибо за ваш совет. Потому что он предназначался для использования файла данных размером более 2 ГБ в среде x86, и я просто хотел использовать тот же код в среде x64.   -  person fx-kirin    schedule 14.06.2016
comment
Насколько я могу судить, fopen64 точно такой же, как fopen в 32-битной версии MinGW. Но я мог ошибаться.   -  person Harry Johnston    schedule 14.06.2016
comment
На самом деле это не то же самое на x86, потому что fopen на x86 не может обрабатывать файл размером более 2 ГБ.   -  person fx-kirin    schedule 14.06.2016
comment
Это верно для Linux. Не в Windows.   -  person Harry Johnston    schedule 14.06.2016
comment
Нет. Это также происходит и в Windows. Проверял в своем проекте. Во всяком случае, я больше не собираюсь его копать.   -  person fx-kirin    schedule 14.06.2016
comment
Это странно - версия MinGW64, на которую я ссылался ранее, определенно не требует, чтобы вы использовали fopen64 для работы с большими файлами (поскольку функция не делает ничего, кроме вызова fopen), и поскольку в Windows нет O_LARGEFILE или каких-либо эквивалент, я не понимаю, как и почему любая другая версия будет делать это. Тем не менее, это не моя проблема. :-) FWIW, если вы больше не заинтересованы в выяснении того, что происходит не так, я рекомендую вам удалить вопрос.   -  person Harry Johnston    schedule 14.06.2016
comment
Спасибо, что остались с этим. Я не знаком с этой землей, поэтому не могу точно сказать, что происходит. В Windows есть _LARGEFILE64_SOURCE, возможно, это близко к ответу. И ответ, который я написал здесь, устранил мою проблему. Я мог бы помочь кому-нибудь, у кого такая же проблема.   -  person fx-kirin    schedule 14.06.2016


Ответы (1)


На данный момент я использую приведенный ниже код.

#if defined(_WIN64)
#define _fopen fopen
#else
#define _fopen fopen64
#endif
person fx-kirin    schedule 13.06.2016