可以在没有 Visual Studio 的情况下使用 MinGw 编译 python.exe
Posted
技术标签:
【中文标题】可以在没有 Visual Studio 的情况下使用 MinGw 编译 python.exe【英文标题】:possible to compile python.exe without Visual Studio, with MinGw 【发布时间】:2016-10-13 18:46:03 【问题描述】:我正在尝试实现此页面上列出的内容: https://blogs.msdn.microsoft.com/pythonengineering/2016/04/26/cpython-embeddable-zip-file/
我要编译的代码是这样的:
#include "Python.h"
int
wmain(int argc, wchar_t **argv)
return Py_Main(argc, argv);
在 VisualStudio 15 中,我必须添加 python/include 并链接到项目中的 python libs 目录,并添加:
#include "stdafx.h"
然后它编译并正常工作。我只是好奇,是否可以使用 mingw 或其他开源 C/C++ 编译器来做到这一点?
如果我放置一个文件my_python.cpp
,其中包含以下内容:
#include "include/Python.h"
int
wmain(int argc, wchar_t **argv)
return Py_Main(argc, argv);
在全新的 32 位 python 3.5 安装(windows 7 x64)的根目录中,cd 到该目录并尝试运行:
gcc my_python.cpp -Llibs -lpython35 -o my_python.exe
我收到此错误:
c:/mingw/bin/../lib/gcc/mingw32/5.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'
有什么方法可以解决这个问题,让它在没有 Visual Studio 的情况下运行?
【问题讨论】:
【参考方案1】:该错误与 Python 无关。 wmain
是特定于 Visual Studio 的。 GCC 不将wmain
视为入口点,它只是作为一个永远不会被调用的函数坐在那里。
GCC 需要 main
或 WinMain
作为入口点。如果没有找到这些入口点,那么编译器会抱怨。所以让我们使用main
作为入口点。
Py_Main
大概需要宽字符串输入。 CommandLineToArgvW
将始终提供。示例:
#include <Windows.h>
#include "include/Python.h"
int main()
int argc;
wchar_t** argv = CommandLineToArgvW( GetCommandLineW(), &argc );
return Py_Main(argc, argv);
如果你仍然遇到同样的错误,只需提供WinMain
入口点就可以了
#include <Windows.h>
#include "include/Python.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
int argc;
wchar_t** argv = CommandLineToArgvW( GetCommandLineW(), &argc );
return Py_Main(argc, argv);
另请注意,*.lib
文件通常用于 Visual Studio。 GCC 版本需要带有 *.a
扩展名的库名称。
【讨论】:
抱歉这么久才回复。我确实尝试过,并且收到错误“未定义对`_imp__Py_Main'的引用。我认为这与您对.a 与.lib 文件的评论有关。我使用pexports 和dlltool 制作.a 文件,但到目前为止一直无法让错误消失。如果我能弄清楚,我会进一步更新以上是关于可以在没有 Visual Studio 的情况下使用 MinGw 编译 python.exe的主要内容,如果未能解决你的问题,请参考以下文章