簡體   English   中英

SWIG,mingw32,distutils的問題

[英]Problems with SWIG, mingw32, distutils

我一直在嘗試在Windows 7下設置Python 2.7環境,以便我可以編譯C ++擴展以在Python中使用。 由於我是新手,我在這里下載了一個簡單的例子並逐字使用了這些文件。 我在路徑中也有一個numpy.i文件。 我用mingw(最新版本)和swig(v.3.0.10)設置了我的計算機,我的Python版本是2.7.9。 我甚至使用這個環境來編譯一個使用g ++的小型C ++程序沒有問題。

但是當我嘗試構建上面引用的“簡單”Python擴展時,我總是得到以下輸出,表示失敗(我已將我在Windows cmd.exe窗口中發出的命令包含在下面的第一行):

python setup.py build -c=mingw32
running build
running build_ext
building '_simple' extension
swigging simple.i to simple_wrap.c
C:\swigwin\swigwin-3.0.10\swig.exe -python -o simple_wrap.c simple.i
C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python27\lib\site-packages\numpy\core\include -I. -IC:\Python27\include -IC:\Python27\PC -c simple.cc -o build\temp.win32-2.7\Release\simple.o
C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python27\lib\sitepackages\numpy\core\include -I. -IC:\Python27\include -IC:\Python27\PC -c simple_wrap.c -o build\temp.win32-2.7\Release\simple_wrap.o
writing build\temp.win32-2.7\Release\_simple.def
C:\MinGW\bin\g++.exe -shared -s build\temp.win32-2.7\Release\simple.o build\temp.win32-2.7\Release\simple_wrap.o build\temp.win32-2.7\Release\_simple.def -LC:\Python27\libs -LC:\Python27\PCbuild -lpython27 -lmsvcr90 -o build\lib.win32-2.7\_simple.pyd
build\temp.win32-2.7\Release\simple_wrap.o:simple_wrap.c:(.text+0xce5): undefined reference to `create_list'
build\temp.win32-2.7\Release\simple_wrap.o:simple_wrap.c:(.text+0x170d): undefined reference to `dot'
collect2.exe: error: ld returned 1 exit status
error: command 'C:\\MinGW\\bin\\g++.exe' failed with exit status 1

我有一種可怕的感覺,我在這里遺漏了一些非常簡單的東西,但我已經成功地在一個單獨的Cygwin環境中成功編譯了這些相同的文件而沒有任何問題(是的,我希望能夠在一個非Cygwin環境)。

我不想用太多代碼來扼殺這個問題,但是,作為參考,這里是我正在使用的文件simple.isetup.py

simple.i:
%module simple
%{
  #define SWIG_FILE_WITH_INIT
  #include "simple.h"
%}

%include "numpy.i"
%init %{
import_array();
%}

%apply (int DIM1, double* INPLACE_ARRAY1) {(int n0, double *a0)};
%apply (int DIM1, double* IN_ARRAY1) {(int n, double *a), (int m, double *b)};
%apply (int DIM1, double* ARGOUT_ARRAY1) {(int size, double *arr)};
%include "simple.h"

setup.py:
from distutils.core import setup, Extension
import numpy
import os

os.environ['CC'] = 'g++';
setup(name='matt_simple_test', version='1.0', ext_modules =[Extension('_simple',['simple.cc', 'simple.i'], include_dirs = [numpy.get_include(),'.'])])

如果需要其他代碼,我很樂意發布它們,但同樣,其他文件( simple.ccsimple.h )從這里逐字逐句使用。

所以,問題是:有人可以指導我糾正這個錯誤嗎?

在此編譯步驟中,輸入文件被編譯為C ++代碼,symbol.cc中的函數將被賦予與C(名稱修改)不兼容的符號。

C:\\ MinGW \\ bin \\ gcc.exe -mdll -O -Wall -IC:\\ Python27 \\ lib \\ site-packages \\ numpy \\ core \\ include -I。 -IC:\\ Python27 \\ include -IC:\\ Python27 \\ PC -c simple.cc -o build \\ temp.win32-2.7 \\ Release \\ simple.o

在此編譯步驟中,輸入文件被編譯為C代碼,而symbols.cc中函數的符號應該是不同的。

C:\\ MinGW \\ bin \\ gcc.exe -mdll -O -Wall -IC:\\ Python27 \\ lib \\ sitepackages \\ numpy \\ core \\ include -I。 -IC:\\ Python27 \\ include -IC:\\ Python27 \\ PC -c simple_wrap.c -o build \\ temp.win32-2.7 \\ Release \\ simple_wrap.o

解決問題的一種方法是添加swig_opts

setup(name='matt_simple_test', version='1.0', 
      ext_modules=[Extension('_simple', ['simple.cc', 'simple.i'],
                   swig_opts=["-c++"],
                   include_dirs = [numpy.get_include(),'.'])])

另一種選擇是在simple.cc中使用extern "C"

extern "C" double dot(int n, double *a, int m, double *b)
...
extern "C" void create_list(int size, double *arr)
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM