python源码编译 mingw_使用 MinGW 编译 C/C++ 写的 python 扩展
擴(kuò)展的代碼可以直接使用 python 文檔中的例子 spam。
編譯的話,可以用 distutils,寫 setup.py 腳本即可。
大致的代碼如下:
from distutils.core import setup, Extension
module1 = Extension('spam', sources = ['src/spammodule.c'])
setup ( name = 'PackageName',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module1])
這樣做存在一個(gè)問題,官方版的 python 文件是用 VS 系列編譯的,執(zhí)行需要加上 mingw 相關(guān)的參數(shù)
python setup.py build -c mingw32
而且 distutils 會(huì)檢查 ld 和 dllwrap 的版本信息,很可能就通不過了
Traceback (most recent call last):
File "setup.py", line 8, in
ext_modules = [module1])
File "D:/Progs/Python25/lib/distutils/core.py", line 151, in setup
dist.run_commands()
File "D:/Progs/Python25/lib/distutils/dist.py", line 974, in run_commands
self.run_command(cmd)
File "D:/Progs/Python25/lib/distutils/dist.py", line 994, in run_command
cmd_obj.run()
File "D:/Progs/Python25/lib/distutils/command/build.py", line 112, in run
self.run_command(cmd_name)
File "D:/Progs/Python25/lib/distutils/cmd.py", line 333, in run_command
self.distribution.run_command(command)
File "D:/Progs/Python25/lib/distutils/dist.py", line 994, in run_command
cmd_obj.run()
File "D:/Progs/Python25/lib/distutils/command/build_ext.py", line 264, in run
force=self.force)
File "D:/Progs/Python25/lib/distutils/ccompiler.py", line 1175, in new_compiler
return klass (None, dry_run, force)
File "D:/Progs/Python25/lib/distutils/cygwinccompiler.py", line 292, in __init__
CygwinCCompiler.__init__ (self, verbose, dry_run, force)
File "D:/Progs/Python25/lib/distutils/cygwinccompiler.py", line 84, in __init__
get_versions()
File "D:/Progs/Python25/lib/distutils/cygwinccompiler.py", line 424, in get_versions
ld_version = StrictVersion(result.group(1))
File "D:/Progs/Python25/lib/distutils/version.py", line 40, in __init__
self.parse(vstring)
File "D:/Progs/Python25/lib/distutils/version.py", line 107, in parse
raise ValueError, "invalid version number '%s'" % vstring
ValueError: invalid version number '2.20.1.20100303'
解決方法的話,無非是給 distutils 打個(gè)補(bǔ)丁或直接修改代碼,去除這些工具的版本限制。
但是嘗試 install 的時(shí)候就無解了。
算了,直接 Makefile 好了,快好省!
#
MODULE_NAME = spam
#
CC = gcc
DLLWRAP = dllwrap
RM = rm -vf
#
PYTHON_DIR = D:/Progs/Python25
LIBS = -L"$(PYTHON_DIR)/libs" -lpython25
INCS = -I"$(PYTHON_DIR)/include"
CFLAGS = $(INCS) -mno-cygwin -mdll -O -Wall
LDFLAGS = $(LIBS) -mno-cygwin -static
DWFLAGS = -mno-cygwin -mdll -static
#
OBJ = spammodule.o
SRC = $(OBJ:.o=.c)
BIN = $(MODULE_NAME).pyd
DEFFILE = $(MODULE_NAME).def
LIBFILE = lib$(MODULE_NAME).a
all: $(BIN)
clean:
$(RM) $(OBJ) $(BIN) $(DEFFILE) $(LIBFILE)
$(BIN): $(OBJ) $(DEFFILE)
$(DLLWRAP) $(DWFLAGS) --output-lib $(LIBFILE) --def $(DEFFILE) -s $< $(LIBS) -o $@
%.o: src/%.c
$(CC) -g -c $< -o $@ $(CFLAGS)
$(DEFFILE): @echo LIBRARY $(BIN)>$(DEFFILE) @echo EXPORTS >>$(DEFFILE) @echo init$(MODULE_NAME)>>$(DEFFILE) .PHONY : installinstall: @cp -vf $(BIN) $(PYTHON_DIR)/Lib/site-packages .PHONY : testtest: $(PYTHON_DIR)/python test.py
總結(jié)
以上是生活随笔為你收集整理的python源码编译 mingw_使用 MinGW 编译 C/C++ 写的 python 扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python写整数逆位运算_简单了解py
- 下一篇: mysql windows 安装_Win