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

时间:2014-06-14 10:33:27

标签: python mingw cython

我试图从Python代码构建独立应用程序。目前它只是一个'#hello world"程序。我用Cython编译它以获得.c文件:

  

" C:\ python34 \脚本\ cython.exe" --embed hello.py

工作正常。然后我尝试编译并链接生成的.c文件,如下所示:

  

" C:\的mingw32 \ BIN \ gcc.exe" -I" C:\ python34 \包括" -L" C:\ python34 \库" -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版本已附带此文件。

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

3 个答案:

答案 0 :(得分:3)

在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)

并用main替​​换wmain。这对我有用。

答案 1 :(得分:2)

确定。我想到了。这里有两个问题:

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

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

  

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

答案 2 :(得分:0)

在mingw-w64(win-builds.org的32位版本)中,gcc-4.8.1有-municode选项,它将使用wmain()作为入口点,UTF-16命令行也能正常工作。遗憾的是,官方文档中没有提到它。经过三天的实验,在一些irc日志中找到它:)