2009-06-18 89 views
1

我正在写一个用C编写的应用程序。应用程序的一部分应该嵌入python,这是我目前的问题。我尝试将我的源代码链接到Python库,但它不起作用。如何链接C库与Python在Windows下嵌入?

当我使用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
  • 的Devsystem是a Windows Server 2008
  • GCC信息:Reading specs from C:/Program Files (x86)/MinGW/bin/../lib/gcc/mingw32/3.4.5/specs Configured with: ../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 Thread model: win32 gcc version 3.4.5 (mingw-vista special r3)

我做错了什么?我如何得到它编译和链接:-)?

干杯,格里高尔


编辑: 我忘了写我的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 

回答

2

在Windows上,python发行版在libs子目录中已经有了libpython26.a,因此不需要使用dll工具生成.a文件。

我曾尝试与单个C文件toto.c一个小例子:

gcc -shared -o ./toto.dll ./toto.c -I/Python26/include/ -L/Python26/libs -lpython26 

它就像一个魅力。希望它会有所帮助:-)

+1

嗯......你说得对。在我的电脑上,我有一个'libpython26.a'。这在Python 2.6.2发行版中必须是新的?因为在家用Python 2.6.1我没有。大。我必须改变你的答案为正确的答案! – Gregor 2009-06-19 10:02:34

+0

简短更新:它完美的工作!非常感谢你。 – Gregor 2009-06-22 08:38:41

1

Python的(至少我的分布)自带的 “蟒蛇 - 配置”程序,可以为各种情况自动创建正确的编译器和链接器选项。不过,我从来没有在Windows上使用它。也许这个工具可以帮助你?

+0

正如我所看到的python-config仅在* nix系统下可用。但是,谢谢你的想法。现在我可以在这些系统下使我的生成文件更好。 – Gregor 2009-06-18 16:13:49

1

IIRC,dlltool并不总是有效。拥有python 2.6 + Wow使事情的可能性更小。对于numpy,这里是我如何did it。基本上,我使用obdump.exe从dll建立表,我解析它来生成.def。你应该检查你的缺失符号是否在.def中,否则它将无法工作。

+0

你是对的,.def文件不包括缺失的功能。我尝试你的方式... – Gregor 2009-06-18 16:14:21

+0

...好吧,无论我尝试我没有在.def文件中获得正确的条目。将进一步尝试 – Gregor 2009-06-18 16:59:52