SWIG

2012-07-03 14 views
5

के साथ एक लिपटे सीपीपी फ़ाइल से एक डीएलएल बनाना, मैं विंडोज़ पर एसडब्ल्यूआईजी का उपयोग करने के तरीके सीखने की प्रक्रिया में हूं।SWIG

/* File : example.h */ 

    class Shape { 
    public: 
    Shape() { 
    nshapes++; 
    } 
    virtual ~Shape() { 
    nshapes--; 
}; 
    double x, y; 
    void move(double dx, double dy); 
    virtual double area(void) = 0; 
    virtual double perimeter(void) = 0; 
    static int nshapes; 
    }; 

class Circle : public Shape { 
private: 
    double radius; 
public: 
    Circle(double r) : radius(r) { }; 
    virtual double area(void); 
    virtual double perimeter(void); 
}; 

class Square : public Shape { 
private: 
    double width; 
public: 
    Square(double w) : width(w) { }; 
    virtual double area(void); 
    virtual double perimeter(void); 
}; 

यह मेरा इंटरफ़ेस फ़ाइल है::

/* File : example.cxx */ 

#include "example.h" 
#define M_PI 3.14159265358979323846 

/* Move the shape to a new location */ 
void Shape::move(double dx, double dy) { 
    x += dx; 
    y += dy; 
} 

int Shape::nshapes = 0; 

double Circle::area(void) { 
    return M_PI*radius*radius; 
} 

double Circle::perimeter(void) { 
    return 2*M_PI*radius; 
} 

double Square::area(void) { 
    return width*width; 
} 

double Square::perimeter(void) { 
    return 4*width; 
} 

यह मेरा हेडर फ़ाइल है:

निम्नलिखित मेरी C++ कोड है

/* File : example.i */ 
%module example 

%{ 
#include "example.h" 
%} 

%include "example.h" 

मैं लपेट में कामयाब रहे मेरी SWIG का उपयोग कर सिगविन में निम्न आदेश के साथ C++ कोड:

$swig -c++ -python -o example_wrap.cpp example.i 

मेरा सवाल है, मैं जेनरेट कोड (example_wrap.cpp) का उपयोग करके इस बिंदु से आगे एक डीएलएल कैसे बना सकता हूं? कोई विचार?

मैं दृश्य स्टूडियो सी ++ 2010 एक DLL बनाने की कोशिश की, लेकिन मैं निर्माण त्रुटि मिलती है: बड़ा घूँट इसलिए किसी भी मदद बहुत सराहना की जाएगी उपयोग करने के लिए

LINK : fatal error LNK1104: cannot open file 'python27_d.lib 

मैं काफी नया हूँ।

धन्यवाद!

उत्तर

5

यदि आप अपने पायथन इंस्टॉलेशन की libs निर्देशिका में देखते हैं तो मुझे संदेह है कि आपको एक python27.lib मिलेगा और एक python27_d.lib नहीं होगा। मेरा मानना ​​है कि _d.lib पायथन पुस्तकालय का डीबग संस्करण है और आपके पायथन इंस्टॉलेशन में इसे शामिल नहीं किया गया है। कहीं और मैंने देखा है कि यह सुझाव दिया गया है कि इसके आसपास का सबसे आसान तरीका पाइथन स्रोतों को डाउनलोड करना और रिलीज और डीबग संस्करणों को स्वयं बनाना है, लेकिन मैंने कभी कोशिश नहीं की है। वैकल्पिक रूप से आप पाइथन .lib के रिलीज़ संस्करण का उपयोग करने के लिए निर्माण करते हैं। आप अपने कोड को डीबग करने में सक्षम होना चाहिए, लेकिन फिर पाइथन कोड नहीं।

+0

अपने शीघ्र उत्तर के लिए जैक्सन धन्यवाद! :) मैंने पाइथन फाइलों की जांच की और ऐसा प्रतीत होता है कि, जैसा कि आपने कहा था, एक python27.lib है लेकिन एक python27_d.lib नहीं है। तो मुझे लगता है कि अगला प्रश्न होगा ... क्या किसी को विजुअल स्टूडियो सी ++ 2010 को पायथन लिब के रिलीज़ संस्करण को स्वीकार करने का तरीका पता है ??? – user1449530

+1

यदि आप प्रोजेक्ट के गुण खोलते हैं और लिंकर-> इनपुट पर जाते हैं तो आपको अतिरिक्त निर्भरता में Python27_d.lib का संदर्भ देखना चाहिए। इसे Python27.lib के रूप में संपादित करें और पुनः संकलन करने का प्रयास करें। – Jackson

+0

आपके समय के लिए जैक्सन फिर से धन्यवाद! मैंने विजुअल स्टूडियो 2010 लिंकर> इनपुट में वापस देखा लेकिन मुझे Python27_d.lib नहीं मिला। अंत में, मैंने साइगविन के साथ चिपकने का फैसला किया। वैसे भी धन्यवाद! – user1449530

5

समस्या यह प्रतीत होती है कि, अज्ञात कारणों से, फ़ाइल pyconfig.h एक विशेष नामित .lib फ़ाइल के उपयोग को फोर्स करता है। ओह! वाकई, यह मेरे लिए एक बग जैसा दिखता है - प्रोग्रामर को निर्दिष्ट करने के लिए .lib फ़ाइल निर्दिष्ट करने दें! इसे मजबूर मत करो!

नीचे दिए गए कोड में, आप बस पूरी चीज़ #ifdeff कर सकते हैं, या "python27_d" का नाम बदलकर "पायथन" कर सकते हैं।

वैसे भी, यहाँ pyconfig.h से आक्रामक कोड है:

/* For an MSVC DLL, we can nominate the .lib files used by extensions 
*/ 
#ifdef MS_COREDLL 
# ifndef Py_BUILD_CORE /* not building the core - must be an ext */ 
#  if defined(_MSC_VER)   /* So MSVC users need not specify the .lib file in   their Makefile (other compilers are generally   taken care of by distutils.) */ 
#   ifdef _DEBUG 
#    pragma comment(lib,"python27_d.lib") 
#   else 
#    pragma comment(lib,"python27.lib") 
#   endif /* _DEBUG */ 
#  endif /* _MSC_VER */ 
# endif /* Py_BUILD_CORE */ 
#endif /* MS_COREDLL */ 
10

विन्यास गुण> C/C++ में MS_NO_COREDLL परिभाषा जोड़ने -> Preprocessor-> प्रीप्रोसेसर परिभाषाएँ; या python.h सहित पहले MS_NO_COREDLL पंक्ति को परिभाषित करें।

#define MS_NO_COREDLL 
#include <Python.h> 
+0

आपको बहुत धन्यवाद, यह वास्तव में मुझे python2.5 संस्करण स्रोत कोड संकलित करने में मदद करता है। लेकिन क्या आप मुझे बता सकते हैं कि इसे क्यों जोड़ना चाहिए? – x5lcfd

+2

इसके बाद मुझे त्रुटि मिलती है LNK2001: अनसुलझा बाहरी प्रतीक _Py_RefTotal –

0

मुझे पता चला कि पाइथन प्रतीकों को जोड़ने से परियोजना हल हो जाती है। जैसे this

मैं भी python27_d.lib

2

रिलीज मोड में परियोजना को हटाता है python27_d.lib निर्भरता भी बिल्डिंग नाम की एक फ़ाइल को python27.lib की नकल की यह करो; कम से कम यह मेरे अपने प्रोजेक्ट के लिए किया था।

0

आप "python27_d" जोड़ने का प्रयास कर सकते हैं।lib "(उद्धरण के बिना) पर ध्यान नहीं दिया libs के लिए:

विन्यास गुण -> लिंकर -> इनपुट -> विशिष्ट लाइब्रेरी पर ध्यान न दें

3

बड़ा घूँट (कम से कम v3.0 पर) के रूप में आवरण में python.h शामिल किए जाने के उत्पन्न करता है इस प्रकार है:।

#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) 
/* Use debug wrappers with the Python release dll */ 
# undef _DEBUG 
# include <Python.h> 
# define _DEBUG 
#else 
# include <Python.h> 
#endif 

तो जब एक Windows मंच पर आवरण के एक डिबग संस्करण संकलन, हम बस केन के जवाब में बताया गया pyconfig.h फ़ाइल मुद्दे से बचने के लिए SWIG_PYTHON_INTERPRETER_NO_DEBUG झंडा परिभाषित करने की जरूरत

0

मैं संकल्प लिया निम्न कार्य करके लापता python27_d.lib:

  • कॉपी python27.lib
  • python27_d.lib को pyconfig.h टिप्पणी बाहर में define Py_DEBUG