使用Cython + MinGW构建独立应用程序

abr*_*mus 7 python mingw cython

我正在尝试从Python代码构建独立的应用程序.目前它只是一个"hello world"计划.我使用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位操作系统.我使用Python 3.4.1 32位,Cython-0.20.1和TDM-GCC 4.7.1 32位.

我做了一些研究.有人说它可能是由例如使用32位C编译器和64位Python引起的.但事实并非如此.其他(http://eli.thegreenplace.net/2008/06/28/compiling-python-extensions-with-distutils-and-mingw/)说我需要创建libpython34.a.但是我的Python版本已经附带了这个文件.

有谁知道我做错了什么?提前致谢.

abr*_*mus 3

好的。我想到了。这里有两个问题:

首先,对“WinMain@16”的未定义引用是由于 Cython 为 Python 3 生成“wmain”而不是“main”。MinGW 中有一个“-municode”命令行选项来支持“wmain”,但是看起来它只在最新的 64 位版本的 MinGW 中实现。我安装的 MinGW 4.8.1 32 位中未实现它。另一种方法是使用 C 中的包装器“main”函数,或者仅使用 Python 2.7。我选择了后者。

其余未定义的引用是由于参数顺序错误造成的。我可以使用以下命令构建应用程序:

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