可以在没有 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 需要 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 扩展名的库名称。

【讨论】:

抱歉这么久才回复。我确实尝试过,并且收到错误“未定义对`_imp__Py_Main'的引用。我认为这与您对.a 与.lib 文件的评论有关。我使用pexports 和dlltool 制作.a 文件,但到目前为止一直无法让错误消失。如果我能弄清楚,我会进一步更新

以上是关于可以在没有 Visual Studio 的情况下使用 MinGw 编译 python.exe的主要内容,如果未能解决你的问题,请参考以下文章