使用MinGW链接到Python [英] Link to Python with MinGW

查看:460
本文介绍了使用MinGW链接到Python的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不想创建一个嵌入python解释器的跨平台程序,并使用MinGW对其进行编译.但是Python Binary发行版不提供供MinGW链接的库(对于Visual C ++,仅提供python32.lib),而Python Source软件包不提供对使用MinGW进行编译的支持.

I wan't want to create a cross-plattform programm that embedds the python interpreter, and compile it with MinGW. But the Python Binary distribution provides no libraries for MinGW to link with (only python32.lib for Visual C++), and the Python Source package provides no support for compiling with MinGW.

我尝试使用-lpython32链接到Mingw中的python32.lib,但是它仍然会产生以下错误:

I tried linking to python32.lib in Mingw with -lpython32 but it still generates errors like:

main.cpp: undefined reference to `_imp__Py_Initialize'
main.cpp: undefined reference to `_imp__Py_Finalize'

如何在MinGW中链接Python?我真的不想切换到使用Visual C ++.

How do I link Python in MinGW? I really don't want to switch to using Visual C++.

推荐答案

使用binutils中的nm和dlltool,您应该能够为gcc重建库:

With nm and dlltool from binutils, you should be able to rebuild the library for gcc:

echo EXPORTS > python32.def
nm python32.lib | grep " T _" | sed "s/.* T _//" >> python32.def
dlltool --input-def python32.def --dllname python32 --output-lib libpython32.a

python_test.c:

python_test.c:

#include "Python.h"

int main(int argc, char *argv[]) {
    Py_Initialize();
    PyRun_SimpleString("from time import time,ctime\n"
                       "print('Today is',ctime(time())\n)");
    Py_Finalize();
    return 0;
}

编译:

gcc -Wall -IC:\Python32\include -LC:\Python32\libs -o python_test.exe python_test.c -lpython32

测试:

C:\python_test.exe
Today is Mon Jul 18 08:50:53 2011

编辑:如果您不想自己在x64上构建它,则可以从Christoph Gohlke的

Edit: If you'd prefer to skip building this yourself on x64, you can download it for several versions from Christoph Gohlke's Unofficial Windows Binaries for Python Extension Packages.

编辑:以下是基于Tools/msi/msi.py中分发的现有功能的Python版本:

Edit: Here's a Python version based on the existing function that's distributed in Tools/msi/msi.py:

import subprocess
import warnings
import re

NM = 'x86_64-w64-mingw32-nm'
DLLTOOL = 'x86_64-w64-mingw32-dlltool'
EXPORT_PATTERN = r'^[_]{1,2}imp_(?P<export>.*) in python\d+\.dll'

def build_libpython(ver, nm=NM, dlltool=DLLTOOL,
                    export_pattern=EXPORT_PATTERN):
    pylib = 'python%s.lib' % ver
    pydef = 'python%s.def' % ver
    pydll = 'python%s.dll' % ver
    libpy = 'libpython%s.a' % ver
    warning = '%s failed - ' + '%s not built' % libpy
    match_export = re.compile(export_pattern).match
    cmd_nm = [nm, '-Cs', pylib]
    cmd_dlltool = [dlltool, 
                   '--dllname', pydll, 
                   '--def', pydef,
                   '--output-lib', libpy]
    with open(pydef, 'w') as f:
        f.write('LIBRARY %s\nEXPORTS\n' % pydll)
        p_nm = subprocess.Popen(cmd_nm, 
                                stdout=subprocess.PIPE,
                                universal_newlines=True)
        for line in sorted(p_nm.stdout):
            m = match_export(line)
            if m:
                f.write(m.group('export') + '\n')
        if p_nm.wait() != 0:
            warnings.warn(warning % nm)
            return False
    if subprocess.call(cmd_dlltool) != 0:
        warnings.warn(warning % dlltool)
        return False
    return True

例如:

import os
for n in (27, 33, 35):
    pylib = 'python%s.lib' % n
    if os.path.exists(pylib):
        build_libpython(n)
        pydef = 'python%s.def' % n            
        lc_def = sum(1 for line in open(pydef))
        libpy = 'libpython%s.a' % n
        lc_lib = sum(1 for line in os.popen('ar -t %s' % libpy))
        assert lc_def == lc_lib

这篇关于使用MinGW链接到Python的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆