2012-07-03 14 views
5

Ich bin dabei, zu lernen, wie SWIG unter Windows zu verwenden.Erstellen einer DLL aus einer eingepackten CPP-Datei mit SWIG

Das folgende ist mein C++ Code:

/* 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; 
} 

Dies ist meine Header-Datei:

/* 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); 
}; 

Dies ist meine Schnittstellendatei:

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

%{ 
#include "example.h" 
%} 

%include "example.h" 

ich es geschafft habe meine einzuwickeln C++ Code mit dem folgenden Befehl in Cygwin mit SWIG:

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

Meine Frage ist, wie kann ich eine DLL von diesem Punkt mit dem generierten Code (example_wrap.cpp) erstellen? Irgendwelche Ideen?

Ich habe versucht, eine DLL mit Visual Studio C++ 2010 zu schaffen, aber ich erhalte die Build-Fehler:

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

ich mit SWIG ziemlich neu bin so wäre jede Hilfe sehr geschätzt.

Danke!

Antwort

5

Wenn Sie im libs-Verzeichnis Ihrer Python-Installation suchen, vermute ich, dass Sie eine python27.lib und keine python27_d.lib finden. Ich glaube, dass die _d.lib die Debug-Version der Python-Bibliothek ist und Ihre Python-Installation sie nicht enthielt. An anderer Stelle habe ich gesehen, dass der einfachste Weg dahin ist, die Python-Quellen herunterzuladen und die Release- und Debug-Versionen selbst zu erstellen, aber ich habe das nie versucht. Alternativ können Sie den Build ändern, um die Release-Version von Python .lib zu verwenden. Sie sollten dann in der Lage sein, Ihren eigenen Code, aber nicht den Python-Code zu debuggen.

+0

Danke Jackson für Ihre prompte Antwort! :) Ich habe die Python-Dateien überprüft und es scheint, dass es wie gesagt eine python27.lib aber keine python27_d.lib gibt. Also ich denke, die nächste Frage wäre ... Kennt jemand eine Möglichkeit, Visual Studio C++ 2010 die Release-Version von Python lib zu akzeptieren ??? – user1449530

+1

Wenn Sie die Eigenschaften des Projekts öffnen und Linker-> Eingabe aufrufen, sollten Sie in den Zusätzlichen Abhängigkeiten einen Verweis auf die Python27_d.lib sehen. Bearbeiten Sie dies als Python27.lib und versuchen Sie es erneut zu kompilieren. – Jackson

+0

Vielen Dank noch einmal Jackson für Ihre Zeit! Ich habe in Visual Studio 2010 Linker> Input zurückgeschaut, aber Python27_d.lib nicht gefunden. Am Ende entschied ich mich, bei Cygwin zu bleiben. Trotzdem danke! – user1449530

5

Das Problem scheint zu sein, dass die Datei pyconfig.h aus unbekannten Gründen die Verwendung einer speziell benannten .lib-Datei FORCES. AUTSCH! Ehrlich gesagt, sieht das für mich wie ein Fehler aus - lassen Sie den Programmierer angeben, welche .lib-Datei verwendet werden soll! Zwinge es nicht!

Im folgenden Code können Sie einfach #ifdef 0 die gesamte Sache, oder "python27_d" in "Python" umbenennen.

Wie auch immer, hier ist die Offensive Code aus 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

hinzufügen MS_NO_COREDLL Definition bei Konfiguration Eigenschaften-> C/C++ -> Preprocessor-> Preprocessor Definitionen; oder fügen Sie die #define MS_NO_COREDLL-Zeile hinzu, bevor Sie python.h einschließen.

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

Vielen Dank, es hilft mir wirklich, Python2.5 Versionsquellcode zu kompilieren. Aber können Sie mir sagen, warum sollte das hinzugefügt werden? – x5lcfd

+2

Danach bekomme ich Fehler LNK2001: ungelöst externes Symbol _Py_RefTotal –

0

Ich fand heraus, dass addind die Python-Symbole das Projekt löst es. Machen Sie es wie this

Ich kopierte auch die python27.lib in eine Datei namens python27_d.lib

2

Erstellen des Projekts in Release-Modus entfernt die python27_d.lib Abhängigkeit zu; zumindest hat es für mein eigenes Projekt getan.

0

Sie können versuchen, "python27_d" hinzuzufügen.lib“(ohne Anführungszeichen) zu ignoriert Libs:

Konfigurationseigenschaften -> Linker -> Input -> Ignorieren Spezifische Bibliothek

3

SWIG (zumindest auf v3.0) in der Wrapper die python.h Aufnahme erzeugt als folgt:. So

#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 

wenn eine Debug-Version der Wrapper auf einer Windows-Plattform kompilieren, wir einfach zu definieren, müssen die SWIG_PYTHON_INTERPRETER_NO_DEBUG Flag die pyconfig.h Datei Ausgabe in Kens Antwort erwähnt zu vermeiden

0

ich beschloss der die folgenden, indem Sie fehlende python27_d.lib:

  • Copy python27.lib
  • In pyconfig.h Kommentar python27_d.lib out define Py_DEBUG
Verwandte Themen