使用MinGW链接到Python
我不想创建一个嵌入python解释器的跨平台程序,并用MinGW编译它。但是Python二进制发行版没有为MinGW提供可链接的库(仅适用于Visual C++的使用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
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
试试这个
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