当前位置: 首页 > 面试题库 >

使用MinGW链接到Python

梁和颂
2023-03-14
问题内容

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

我尝试python32.lib在Mingw中链接到,-lpython32但仍然会产生如下错误:

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

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


问题答案:

使用binutils的nm和dlltool,您应该能够为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:

#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的Python扩展软件包的非官方Windows二进制文件中下载几个版本的版本。

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

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


 类似资料:
  • 问题内容: 我正在使用Ubuntu 13.04,并使用安装了mingw-w64 。我可以使用以下命令来编译和链接程序的64位工作版本: 生成一个64位的 app.exe 文件。 我使用哪些二进制或命令行标志来生成32位版本的app.exe? 问题答案: 这取决于您当前正在使用哪种工具链。既 DWARF 和_SEH_变体(它们来自GCC4.8.0开始)仅单一目标。您可以通过检查其发行版的目录结构来自

  • 问题内容: 我正在尝试使用集成使用我的应用程序编写的第三方库。我已经为测试编写了所有的python代码。我很难找到设置此示例的方法。 我有一个手动创建的文件。第三方给了我a和a 。据我所知,没有其他依赖项。有人可以提供使用和进行设置的示例吗? 谢谢 问题答案: 当然可以! (在下文中,我假设你已经知道如何处理之间和交互和,如果这不是完全的情况下,只问我会开发部分以及) 示例(来自我的C ++项目,

  • 问题内容: 如何在Flask中使用引用文件夹中的文件?例如,我的文件夹中有一些静态文件,其中一些可能位于子文件夹中。 当我尝试从提供文件时,出现错误。 我可以使用此功能来引用不在子文件夹中的文件。 引用静态文件的正确方法是什么?如何使用任何级别的静态文件生成URL? 问题答案: 默认情况下,你具有静态文件的端点。还应用有以下参数: :可用于为网络上的静态文件指定其他路径。默认为文件夹的名称。 :包

  • MinGW 是一个可自由使用和自由发布的 Windows 特定头文件和使用GNU工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时库。 MinGW,即 Minimalist GNU For Windows。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC 产生 Win32 程序。 在基本层,MinGW 是一组包含文件和端口库,其功能是

  • 问题内容: 如何在Flask中使用引用文件夹中的文件?例如,我的文件夹中有一些静态文件,其中一些可能位于子文件夹中。 当我尝试从提供文件时static/bootstrap,出现错误。 我可以使用此功能来引用不在子文件夹中的文件。 引用静态文件的正确方法是什么url_for?如何使用url_for任何级别的静态文件生成URL? 问题答案: 默认情况下,你具有静态文件的端点。还应用有以下参数: :可用

  • 这是我的代码: 注意:scanf内部的\n是我防止尾随换行符问题的方法。这不是最好的解决方案,但我使用它太多了,目前它正在成为我的习惯。:-) 我的预期输入和程序结果是: 输入: 对于输出,它不是打印回89,而是显示以下输出: 我用的是MSYS2包的g (GCC) 4.9.1。我注意到了g,因为我的代码中有一部分正在使用C STL。 已编辑:我通过使用标准而不是更改了我的代码,这是我的预期输入和程