使用 MinGW 编译 C/C++ 写的 python 扩展
来源:互联网 发布:php rbac 编辑:程序博客网 时间:2024/05/23 13:03
扩展的代码可以直接使用 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])
这样做存在一个问题,官方版的 python 文件是用 VS 系列编译的,执行需要加上 mingw 相关的参数
python setup.py build -c mingw32
而且 distutils 会检查 ld 和 dllwrap 的版本信息,很可能就通不过了
Traceback (most recent call last):
File "setup.py", line 8, in <module>
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 打个补丁或直接修改代码,去除这些工具的版本限制。
但是尝试 install 的时候就无解了。
算了,直接 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 : install
install:
@cp -vf $(BIN) $(PYTHON_DIR)/Lib/site-packages
.PHONY : test
test:
$(PYTHON_DIR)/python test.py
- 使用 MinGW 编译 C/C++ 写的 python 扩展
- 使用MinGW 编译python扩展模块
- 自己动手写python的c语言扩展
- 写python的c扩展简介
- 写python的c扩展简介
- 写python的c扩展简介
- 写python的扩展模块(C)
- Python 扩展使用 C/C++ 给 Python 写扩展模块的方法
- Mingw下python C api编译
- 用Cython编译Python的C扩展
- 用Cython编译Python的C扩展
- 使用 MinGW 建立 C语言编译环境
- 使用MINGW搭载c语言编译环境
- minGW 编译.c
- mingw编译segmenter.c
- window下使用Mingw编译python扩展库ujson
- 使用VS2010编写Python的C扩展
- Python的C扩展
- Objective-C中init函数实现的相关研究
- [初学ORACLE] Backup and Recovery Quick Start Guide 此文紧作为此书的读后感
- JS实现日期加减
- 开张!!!
- 无题~~~
- 使用 MinGW 编译 C/C++ 写的 python 扩展
- 对list集合中的对象按照字段属性排序
- Eclipse代码 颜色 字体
- 小鱼:你的网站是局域网吗?
- Java 学习
- 计算大数阶乘
- 算法的时间复杂度
- java学前须知
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!