如何在Windows下将C库链接到Python中以实现嵌入?
我正在开发一个用C语言写的应用程序。应用程序的一部分需要嵌入Python,这就是我现在遇到的问题。我尝试将我的源代码链接到Python库,但没有成功。
因为我使用的是MinGW,所以我用dlltool把python26.lib文件转换成了python26.a文件,并把这个*.a文件放在了C:/Program Files (x86)/python/2.6/libs
目录下。
因此,我用以下命令编译文件:
gcc -shared -o mod_python.dll mod_python.o "-LC:\Program Files (x86)\python\2.6\libs" -lpython26 -Wl,--out-implib,libmod_python.a -Wl,--output-def,mod_python.def
但是我遇到了这些错误:
Creating library file: libmod_python.a
mod_python.o: In function `module_init':
mod_python.c:34: undefined reference to `__imp__Py_Initialize'
mod_python.c:35: undefined reference to `__imp__PyEval_InitThreads'
... and so on ...
- 我的Python“根”文件夹是
C:\Program Files (x86)\python\2.6
- 开发系统是Windows Server 2008
- GCC信息:
正在读取来自C:/Program Files (x86)/MinGW/bin/../lib/gcc/mingw32/3.4.5/specs的规格 配置选项:../gcc-3.4.5-20060117-3/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug 线程模型:win32 gcc版本3.4.5 (mingw-vista special r3)
我哪里做错了?我该如何编译和链接呢?:-)
谢谢,gregor
编辑: 我忘了写关于我的Python安装的信息:这是官方的python.org安装版本2.6.1
... 还有我如何创建python.a文件的过程:
dlltool -z python.def --export-all-symbols -v c:\windows\system32\python26.dll
dlltool --dllname c:\Windows\system32\python26.dll --def python.def -v --output-lib python26.a
3 个回答
1
如果我没记错的话,dlltool并不是总能正常工作。如果你用的是Python 2.6加上Wow环境,那事情就更不容易搞定了。关于numpy,我是这样做的:我使用obdump.exe从dll文件中生成一个表格,然后解析这个表格来创建.def文件。你需要检查一下你缺失的符号是否在.def文件里,否则就没法正常工作。
1
Python(至少我用的版本)自带一个叫“python-config”的程序,它可以自动生成适合不同情况的编译器和链接器选项。不过,我在Windows上从来没用过这个工具。也许这个工具对你有帮助呢?
3
在Windows系统上,Python的安装包里已经包含了一个叫做libpython26.a
的文件,放在libs这个子文件夹里,所以不需要用dll工具去生成.a
文件。
我试了一个简单的例子,只有一个C语言文件toto.c:
gcc -shared -o ./toto.dll ./toto.c -I/Python26/include/ -L/Python26/libs -lpython26
结果运行得非常顺利。希望这能帮到你 :-)