我试图从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版本已附带此文件。
有谁知道我做错了什么?提前谢谢。
答案 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日志中找到它:)