Python中使用MinGW编译C++扩展

Python中可以使用

python setup.py build -c mingw32 install

安装包含C++扩展的第三方库,但需要先安装MinGW 5.1.4及以后版本,并将C:\MinGW\bin目录加入到环境变量。

安装过程中可能会出现以下错误:

  • gcc: error: unrecognized command line option ‘-mno-cygwin’
    解决方法:修改C:\Python27\Lib\distutils\cygwinccompiler.py文件,去掉里面出现的-mno-cygwin
  • undefined reference to ‘_imp__PyExc_TypeError’
    解决方法:

    1. 在MinGW中安装pexports工具
    2. 执行命令 pexports C:\Windows\SysWOW64\python27.dll > python27.def,在当前目录下生成python27.def文件
    3. 执行命令 dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a,在当前目录下生成libpython27.a文件,并移动到C:\Python27\libs目录中
  • 编译出的pyd无法加载

报错信息为:ImportError: DLL load failed: 找不到指定的模块。

运行ctypes.windll.kernel32.LoadLibraryA(pyd_path),报错如下:

解决方法如下:

修改文件C:\Python27\Lib\distutils\cygwinccompiler.py,类CygwinCCompiler的构造函数中使用了如下逻辑:

        # ld_version >= "2.13" support -shared so use it instead of
        # -mdll -static
        if self.ld_version >= "2.13":
            shared_option = "-shared"
        else:
            shared_option = "-mdll -static"

在高版本中默认使用了动态链接,强制改成静态链接,重新编译即可。

分享