可以在没有Visual Studio的情况下使用MinGw编译python.exe

possible to compile python.exe without Visual Studio, with MinGw

本文关键字:MinGw 编译 exe python 情况下 Studio Visual      更新时间:2023-10-16

我正在努力实现这一页上列出的事情: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库目录,并添加:

#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的情况下运行?

此错误与Python无关。wmain是Visual Studio特有的。GCC不把wmain当作入口点,它只是作为一个永远不会被调用的函数。

GCC要求mainWinMain作为入口点。如果这两个入口点都没有找到,编译器就会报错。所以我们就用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