2012-07-03 37 views
5

Tôi đang trong quá trình học cách sử dụng SWIG trên Windows.Tạo một DLL từ một tệp cpp bọc với SWIG

Sau đây là C++ mã của tôi:

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

Đây là tập tin tiêu đề của tôi:

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

Đây là tập tin giao diện của tôi:

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

%{ 
#include "example.h" 
%} 

%include "example.h" 

tôi đã quản lý để quấn của tôi mã C++ với lệnh sau trong Cygwin sử dụng SWIG:

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

Câu hỏi của tôi là, làm cách nào để tạo một DLL từ thời điểm này trở đi bằng cách sử dụng mã được tạo (example_wrap.cpp)? Bất kỳ ý tưởng?

tôi đã cố gắng tạo ra một DLL với Visual Studio C++ 2010 nhưng tôi nhận được lỗi build:

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

Tôi khá mới để sử dụng SWIG vì vậy bất kỳ trợ giúp sẽ được đánh giá cao.

Cảm ơn!

Trả lời

5

Nếu bạn nhìn vào thư mục libs của bản cài đặt Python, tôi nghi ngờ bạn sẽ tìm thấy một python27.lib chứ không phải python27_d.lib. Tôi tin rằng _d.lib là phiên bản gỡ lỗi của thư viện Python và cài đặt Python của bạn không bao gồm nó. Ở những nơi khác tôi đã thấy nó gợi ý rằng cách đơn giản nhất xung quanh việc này là tải xuống các nguồn Python và tự xây dựng bản phát hành và gỡ lỗi nhưng tôi chưa bao giờ thử điều này. Hoặc thay đổi bạn xây dựng để sử dụng phiên bản phát hành của Python .lib. Bạn sẽ có thể gỡ lỗi mã của riêng bạn nhưng không thể mã Python sau đó.

+0

Cảm ơn bạn Jackson cho câu trả lời nhanh chóng của bạn! :) Tôi đã kiểm tra các tập tin Python và nó xuất hiện, như bạn đã nói, có một python27.lib nhưng không phải là một python27_d.lib. Vì vậy, tôi đoán câu hỏi tiếp theo sẽ là ... không ai biết một cách để làm cho Visual Studio C++ 2010 chấp nhận phiên bản phát hành của Python lib ??? – user1449530

+1

Nếu bạn mở các thuộc tính của dự án và đi đến Linker-> Input, bạn sẽ thấy trong phần phụ thuộc bổ sung một tham chiếu đến Python27_d.lib. Chỉnh sửa nó thành Python27.lib và thử biên dịch lại. – Jackson

+0

Cảm ơn bạn một lần nữa Jackson vì đã dành thời gian của bạn! Tôi nhìn lại trong Visual Studio 2010 Linker> Đầu vào nhưng không tìm thấy Python27_d.lib. Cuối cùng, tôi quyết định gắn bó với Cygwin. Cảm ơn bạn anyway! – user1449530

5

Vấn đề có vẻ là, vì lý do không rõ, tệp pyconfig.h FORCES sử dụng tệp .lib được đặt tên cụ thể. BAO GIỜ! Thành thật mà nói, điều này trông giống như một lỗi đối với tôi - hãy để cho lập trình viên chỉ định tệp .lib nào để sử dụng! Đừng ép buộc!

Trong mã bên dưới, bạn có thể chỉ cần #ifdef 0 toàn bộ điều hoặc đổi tên "python27_d" thành "python".

Dù sao, đây là mã tấn công từ 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

thêm MS_NO_COREDLL định nghĩa tại Cấu hình Properties-> C/C++ -> Preprocessor-> Preprocessor định nghĩa; hoặc thêm #define MS_NO_COREDLL dòng trước khi bao gồm python.h.

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

Cảm ơn bạn rất nhiều, nó thực sự giúp tôi biên dịch mã nguồn phiên bản python2.5. Nhưng bạn có thể cho tôi biết lý do tại sao nên thêm điều này? – x5lcfd

+2

Sau này tôi nhận được lỗi LNK2001: biểu tượng bên ngoài chưa được giải quyết _Py_RefTotal –

0

Tôi phát hiện ra rằng addind các biểu tượng Python làm Dự án giải quyết nó. Làm điều đó như this

Tôi cũng sao chép python27.lib đến một file có tên python27_d.lib

2

Xây dựng dự án trong chế độ Release xóa bỏ sự phụ thuộc python27_d.lib quá; ít nhất nó đã làm cho dự án của riêng tôi.

0

Bạn có thể thử thêm "python27_d.lib"(không có dấu ngoặc kép) để libs bỏ qua:

Configuration Properties -> Linker -> Input -> Bỏ qua Thư viện Cụ

3

SWIG (ít nhất là trên v3.0) tạo ra sự bao gồm python.h trong wrapper như sau:.

#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 

Vì vậy, khi biên soạn một phiên bản debug của wrapper trên một nền tảng Windows, chúng tôi chỉ đơn giản là cần phải xác định SWIG_PYTHON_INTERPRETER_NO_DEBUG cờ để tránh những vấn đề pyconfig.h tập tin đề cập trong câu trả lời của Ken

0

tôi giải quyết thiếu python27_d.lib bằng cách làm như sau:

  • Sao chép python27.lib để python27_d.lib
  • Trong pyconfig.h bình luận ra define Py_DEBUG
Các vấn đề liên quan