2012-06-25 11 views
24

तो मेरे पास कुछ पायथन सी एक्सटेंशन हैं जिन्हें मैंने पहले बनाया है और 32 बिट पायथन में Win7 में चल रहा है। हालांकि अब मैंने 64 बिट पायथन पर स्विच किया है, और मुझे सीजी एक्सटेंशन को मिनजीडब्ल्यू-डब्ल्यू 64 के साथ बनाने में समस्याएं हैं।मैं पायथन में MinGW-w64 के साथ अपने सी एक्सटेंशन कैसे बना सकता हूं?

मैं प्रति this post distutils के रूप में परिवर्तन किए हैं, लेकिन मैं कुछ सुझाव दे कुछ अजीब त्रुटियों हो रही है गलत है:

$ python setup.py build 
running build 
running build_ext 
building 'MyLib' extension 
c:\MinGW64\bin\x86_64-w64-mingw32-gcc.exe -mdll -O -Wall -Ic:\Python27\lib\site-packages\numpy\core\include -Ic:\Python27\include -Ic:\Python27\PC -c MyLib.c -o build\temp.win-amd64-2.7\Release\mylib.o 
MyLib.c: In function 'initMyLib': 
MyLib.c:631:5: warning: implicit declaration of function 'Py_InitModule4_64' [-Wimplicit-function-declaration] 
writing build\temp.win-amd64-2.7\Release\MyLib.def 
c:\MinGW64\bin\x86_64-w64-mingw32-gcc.exe -shared -s build\temp.win-amd64-2.7\Release\mylib.o build\temp.win-amd64-2.7\Release\MyLib.def -Lc:\Python27\libs -Lc:\Python27\PCbuild\amd64 -lpython27 -o build\lib.win-amd64-2.7\MyLib.pyd 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x13d): undefined reference to `__imp_PyExc_ValueError' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1275): undefined reference to `__imp_PyExc_ValueError' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1eef): undefined reference to `__imp_PyExc_ImportError' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f38): undefined reference to `__imp_PyExc_AttributeError' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f4d): undefined reference to `__imp_PyCObject_Type' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f61): undefined reference to `__imp_PyExc_RuntimeError' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1fc7): undefined reference to `__imp_PyExc_RuntimeError' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1ffe): undefined reference to `__imp_PyExc_RuntimeError' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x2042): undefined reference to `__imp_PyExc_RuntimeError' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x206c): undefined reference to `__imp_PyExc_RuntimeError' 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x208a): more undefined references to `__imp_PyExc_RuntimeError' follow 
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x20a7): undefined reference to `__imp_PyExc_ImportError' 
collect2.exe: error: ld returned 1 exit status 
error: command 'x86_64-w64-mingw32-gcc' failed with exit status 1 

मैं जानकारी प्राप्त करने के काफ़ी आसपास googled है, लेकिन यह पता लगाने के लिए आसान नहीं है एक निश्चित जवाब। क्या कोई इस पर कुछ प्रकाश डाल सकता है? Win7 में 64 बिट पायथन के लिए सफलतापूर्वक सी एक्सटेंशन बनाने में सक्षम होने के लिए मुझे और क्या परिवर्तन करना चाहिए?

संपादित करें:

cgohlke की टिप्पणी में कुछ उपयोगी संकेत नीचे मैं libpython27.a उत्पन्न करने में कामयाब होने के बाद। हालांकि this post (2 से आखिरी) पर सलाह का पालन करने के बाद भी मुझे __imp_Py_InitModule4_64 त्रुटि मिली। कुछ गंभीर Google-fu के बाद मैं this post पर यात्रा करने में कामयाब रहा, मुझे Py_InitModule4 लाइन का नाम Py_InitModule4_64 पर पुनर्नामित करने में कहा गया। उसके बाद सब कुछ तैराकी से काम किया।

+11

आपको 'gendef.exe python27.dll' और 'dlltool.exe --dllname python27.dll --def python27.def --output-lib libpython27.a' के साथ' libpython27.a' बनाने की आवश्यकता है और इसे रखें 'सी: \ Python27 \ libs' – cgohlke

+0

में मैंने कुछ पदों को गेंडफ का उल्लेख किया। लेकिन libpython27.a फ़ाइल पीढ़ी के बारे में जानकारी कैसे प्राप्त करना आसान नहीं है। क्या आप किसी के बारे में जानना चाहते हैं? – c00kiemonster

+0

ओह ठीक है, gendef और dlltool दो अलग-अलग कमांड हैं। कोशिश करेंगे। धन्यवाद। – c00kiemonster

उत्तर

11

यह अजगर 3.3 के साथ मेरे लिए काम किया:

  1. dll से स्थिर अजगर lib बनाने

    अजगर dll सी में आमतौर पर है:/विंडोज/System32; msys में शेल:

    gendef.exe python33.dll 
    
    dlltool.exe --dllname python33.dll --def python33.def --output-lib libpython33.a 
    
    mv libpython33.a C:/Python33/libs 
    
  2. उपयोग बड़ा घूँट रैपर

    जैसे, उत्पन्न करने के लिए swig -c++ -python myExtension.i

  3. आवरण MS_WIN64 साथ संकलित किया जाना चाहिए, या जब आप अजगर

    में वर्ग आयात आपका कंप्यूटर क्रैश जाएगा
    g++ -c myExtension.cpp -I/other/includes 
    
    g++ -DMS_WIN64 -c myExtension_wrap.cxx -IC:/Python33/include 
    
  4. साझा लाइब्रेरी

    01 आयात myExtension

देखा:

g++ -shared -o _myExtension.pyd myExtension.o myExtension_wrap.o -lPython33 -lOtherSharedLibs -LC:/Python33/libs -LC:/path/to/other/shared/libs 
  • सुनिश्चित करें कि सभी साझा libs (GDAL, OtherSharedLibs) अपने पथ (विंडोज़ LD_LIBRARY_PATH या PYTHONPATH प्रयोग नहीं करते)

  • अजगर में

    , बस में कर रहे हैं !