Создание автономного приложения с помощью Cython + MinGW

Я пытаюсь создать автономное приложение из кода Python. На данный момент это всего лишь программа "Привет, мир". Я компилирую его с помощью Cython, чтобы получить файл .c:

  

"c: \ python34 \ scripts \ cython.exe" - embed hello.py

Это отлично работает. Затем я пытаюсь скомпилировать и связать сгенерированный файл .c следующим образом:

  

"c: \ mingw32 \ bin \ gcc.exe" -I "c: \ python34 \ include" -L "c: \ python34 \ libs" -lpython34 -ohello.exe hello.c

Это дает мне много ошибок в ссылках:

  

... \ cc7PmSei.o: hello.c :(. text + 0xe9): неопределенная ссылка на `_imp__PyTuple_New '

     

... \ cc7PmSei.o: hello.c :(. text + 0x130): неопределенная ссылка на `_imp__PyBytes_FromStringAndSize '

     

... \ cc7PmSei.o: hello.c :(. text + 0x177): неопределенная ссылка на `_imp__PyModule_Create2 '

     

...

     

... \ cc7PmSei.o: hello.c :(. text + 0x12b7): неопределенная ссылка на `_imp__PyUnicode_Decode '

     

... \ cc7PmSei.o: hello.c :(. text + 0x12dd): неопределенная ссылка на `_imp__PyUnicode_FromStringAndSize '

     

... \ cc7PmSei.o: hello.c :(. text + 0x1303): неопределенная ссылка на `_imp__PyBytes_FromStringAndSize '

     

... /libmingw32.a (main.o): main.c: .text.startup + 0xa7): неопределенная ссылка на `WinMain @ 16 '

     

collect2.exe: ошибка: ld вернул 1 состояние выхода

Еще немного информации: у меня Windows 7 Home 64-bit OS. Я использую 32-битный Python 3.4.1, 32-битный Cython-0.20.1 и TDM-GCC 4.7.1.

Я провел небольшое исследование. Некоторые люди говорят, что это может быть вызвано, например, использованием 32-битного компилятора C и 64-битного Python. Но это не тот случай, здесь. Прочее /06/28 /compiling-python-extensions-with-distutils-and-mingw /) говорят, что мне нужно создать libpython34.a. Но моя версия Python уже шла с этим файлом.

Кто-нибудь знает, что я делаю не так? Заранее спасибо.

7 голосов | спросил abramus 14 J0000006Europe/Moscow 2014, 14:33:27

3 ответа


0

Ok. Я понял. Здесь есть две проблемы:

Во-первых, неопределенная ссылка на 'WinMain @ 16' связана с тем, что Cython генерирует 'wmain' вместо 'main' для Python 3. В MinGW есть опция командной строки -municode для поддержки 'wmain ', но похоже, что он реализован только в последних 64-битных версиях MinGW. Это не реализовано в MinGW 4.8.1 32-bit, которую я установил. Альтернатива состоит в том, чтобы использовать 'main' функцию оболочки в C или просто использовать Python 2.7. Я выбрал последнее.

Остальные неопределенные ссылки связаны с неправильным порядком параметров. Я могу прекрасно построить приложение с помощью следующей команды:

  

"c: \ mingw \ bin \ gcc.exe" -I "c: \ python27 \ include" -L "c: \ python27 \ libs" hello.c -ohello.exe -lpython27

ответил abramus 15 J0000006Europe/Moscow 2014, 16:29:33
0

В hello.c найди:

#if PY_MAJOR_VERSION < 3
int main(int argc, char** argv) {
#elif defined(WIN32) || defined(MS_WINDOWS)
int wmain(int argc, wchar_t **argv)

и замените wmain на main. Это сработало для меня.

ответил GriMel 1 +04002014-10-01T19:44:28+04:00312014bEurope/MoscowWed, 01 Oct 2014 19:44:28 +0400 2014, 19:44:28
0

В mingw-w64 (32-битная версия от win-builds.org) в gcc-4.8.1 есть опция -municode, и она будет использовать wmain () в качестве точки входа, также командная строка UTF-16 будет работать правильно. Жаль, что это не упоминается нигде в официальных документах. Обнаружил его в каком-то журнале IRC после трех дней экспериментов:)

ответил greblus 8 62014vEurope/Moscow11bEurope/MoscowSat, 08 Nov 2014 03:55:40 +0300 2014, 03:55:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132