使用 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


 

 

 

 

原创粉丝点击