Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MinGW链接到Python_Python_Mingw - Fatal编程技术网

使用MinGW链接到Python

使用MinGW链接到Python,python,mingw,Python,Mingw,我不想创建一个嵌入python解释器的跨平台程序,并用MinGW编译它。但是Python二进制发行版没有为MinGW提供可链接的库(仅适用于Visual C++的python32.lib),Python源代码包也不支持使用MinGW进行编译 我尝试使用-lpython32在Mingw中链接到python32.lib,但它仍然会产生如下错误: main.cpp: undefined reference to `_imp__Py_Initialize' main.cpp: undefined ref

我不想创建一个嵌入python解释器的跨平台程序,并用MinGW编译它。但是Python二进制发行版没有为MinGW提供可链接的库(仅适用于Visual C++的
python32.lib
),Python源代码包也不支持使用MinGW进行编译

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

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

如何在MinGW中链接Python?我真的不想用VisualC++,

使用NM和DLULoTobe从BIUTILS转换,您应该能够为GCC:< /P>重建库
echo导出>python32.def
nm python32.lib | grep“T |”sed“s/*T/”>>python32.def
dlltool--输入def python32.def--dllname python32--输出libpython32.a
python_test.c:

#包括“Python.h”
int main(int argc,char*argv[]){
Py_初始化();
PyRun_SimpleString(“从导入时间开始,ctime\n”
“打印('Today is',ctime(time())\n)”;
Py_Finalize();
返回0;
}
汇编:

gcc-Wall-IC:\Python32\include-LC:\Python32\libs-o python\u test.exe python\u test.c-lpython32
测试:

C:\python\u test.exe
今天是2011年7月18日星期一08:50:53
编辑:如果您不想自己在x64上构建它,您可以从Christoph Gohlke下载多个版本

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

导入子流程
进口警告
进口稀土
NM='x86_64-w64-mingw32-NM'
DLLTOOL='x86_64-w64-mingw32-DLLTOOL'
在python\d+\.dll中导出\u PATTERN=r'^[\u]{1,2}imp\up.*)
def build_libpython(版本,nm=nm,dlltool=dlltool,
导出模式=导出模式):
pylib='python%s.lib'%1!'
pydef='python%s.def'%1!'
pydll='python%s.dll'%1!'
libpy='libpython%s.a'%1!'
警告=“%s失败-”+“%s未生成“%libpy”
match\u export=re.compile(导出模式).match
cmd_nm=[nm,'-Cs',pylib]
cmd_dlltool=[dlltool,
'--dllname',pydll,
“--def”,pydef,
'--output lib',libpy]
将open(pydef,'w')作为f:
f、 写入('库%s\n端口'%pydll]
p_nm=子流程Popen(cmd_nm,
stdout=子流程.PIPE,
通用(新行=真)
对于已排序的行(p_nm.stdout):
m=匹配输出(行)
如果m:
f、 写入(m.group('export')+'\n')
如果p_nm.wait()!=0:
警告。警告(警告%nm)
返回错误
如果子进程调用(cmd_dlltool)!=0:
警告。警告(警告%dlltool)
返回错误
返回真值
例如:

导入操作系统
对于n in(27,33,35):
pylib='python%s.lib'%n
如果os.path.exists(pylib):
build_libpython(n)
pydef='python%s.def'%n
lc_def=总和(1表示线路开路(pydef))
libpy='libpython%s.a'%n
lc_lib=sum(os.popen('ar-t%s'%libpy')中的行为1)
断言lc_def==lc_lib
试试这个

  • 下载您的mingw(32或更高版本),并在msys shell中
  • 运行
    gendef/c/windows/system32/python32.dll
  • 运行
    dlltool-D python32.dll-D python32.def-l libpython32.a
  • libpython32.a
    复制到
    /python32/libs
    目录中
  • 如果您的
    libpython32.a
    文件为0字节,则表示出现了问题。仔细检查您是否下载了适用于您的mingw/msys版本的正确版本的gendef。如果您运行的是64位构建,您可能需要下载gendef二进制文件并自行编译,但这很简单

    希望有帮助。

    EmbeddingPython.c

    #include <Python.h>
    
    int main(int argc, char *argv[])
    {
        Py_SetProgramName((wchar_t *)argv[0]);  /* optional but recommended */
        Py_Initialize();
        PyRun_SimpleString("from time import time,ctime\n"
            "print('Today is', ctime(time()))\n");
        Py_Finalize();
        return 0;
    }
    
    正如我们所期望的那样

    D:\>a.exe
    Today is Fri Aug 29 15:14:04 2014
    

    nm不起作用,但我在源代码包中找到了一个python32.def。但MinGW不知怎的抱怨说他找不到python3.lib(是的,设置了库搜索路径:)。。。。该
    libpython32.a
    不是8天前发布的最新版本3.2.1的一部分。我想我会使用3.2。这在C主函数的情况下对我有效,但是,当我尝试构建一个使用-shared标志的dll时,它不起作用。在这种情况下,我又回到了同样的错误:对于我来说,在Python 2.7中,这种创建.def文件的方法遗漏了许多名称不以uu开头的方法(例如,
    \uuu imp\u PyEval\u CallFunction
    \uu imp\u PyInt\u from long
    ),我仍然有未定义的引用错误。使用RMWChaos建议的
    gendef
    解决了这个问题。@lapis,我知道你已经有了一个有效的解决方案,但是如果你想尝试一下,试试我最近编辑的
    build_libpython
    函数。你的问题是不是已经解决了?另外,你写的东西不正确。Python发行版确实提供了可以与MinGW(或任何其他C编译器)一起使用的库。没有使用MSVC的要求。但是需要匹配32位和64位的体系结构。如果您试图构建共享DLL,这仍然不能解决问题。如果Py_Initialize()调用是一个导出的DLL例程,它不会链接,您仍然会得到未定义的对_imp_upy_Initialize的引用大多数Python的Windows版本是用MSVC构建的,因此如果用GCC构建,这些库将与此解决方案不兼容。这将在搜索-lpython34时报告一堆“跳过不兼容”错误,后面是“找不到-lpython34”。
    D:\>a.exe
    Today is Fri Aug 29 15:14:04 2014