7

WindowsでSWIGを使用する方法を学習中です。

以下は私のC++コードです:

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

これは私のヘッダーファイルです:

/* 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.i */
 %module example

 %{
 #include "example.h"
 %}

 %include "example.h"

SWIG を使用して、Cygwin で次のコマンドを使用して C++ コードをラップすることができました。

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

私の質問は、生成されたコード (example_wrap.cpp) を使用して、この時点から DLL を作成するにはどうすればよいですか? 何か案は?

Visual Studio C++ 2010 で DLL を作成しようとしましたが、ビルド エラーが発生しました。

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

私はSWIGを使用するのにかなり慣れていないので、どんな助けでも大歓迎です。

ありがとう!

4

8 に答える 8

12

[構成プロパティ]->[C/C++]->[プリプロセッサ]->[プリプロセッサ定義]にMS_NO_COREDLL定義を追加します。または、python.hを含める前に#defineMS_NO_COREDLL行を追加します。

#define MS_NO_COREDLL
#include <Python.h>
于 2013-01-17T05:01:53.240 に答える
5

問題は、不明な理由で、ファイル pyconfig.h が特定の名前の .lib ファイルの使用を強制することのようです。ああ!率直に言って、これはバグのように思えます。使用する .lib ファイルをプログラマーに指定させてください。強制しないでください!

以下のコードでは、単純に全体を #ifdef 0 にするか、「python27_d」の名前を「python」に変更します。

とにかく、これは 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 */
于 2012-07-05T18:21:42.457 に答える
5

Python インストールの libs ディレクトリを見ると、python27_d.lib ではなく、python27.lib が見つかると思います。_d.lib は Python ライブラリのデバッグ バージョンであり、Python インストールには含まれていないと思います。これを回避する最も簡単な方法は、Python ソースをダウンロードし、リリース バージョンとデバッグ バージョンを自分でビルドすることであると示唆されているのを見たことがありますが、私はこれを試したことはありません。または、Python .lib のリリース バージョンを使用するようにビルドを変更します。独自のコードをデバッグできるはずですが、Python コードはデバッグできません。

于 2012-07-03T14:24:48.520 に答える
5

SWIG (少なくとも 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 プラットフォームでラッパーのデバッグ バージョンをコンパイルする場合、Ken の回答で言及されているファイルの問題SWIG_PYTHON_INTERPRETER_NO_DEBUGを回避するために、フラグを定義するだけで済みます。pyconfig.h

于 2015-09-17T13:19:18.747 に答える
2

プロジェクトをリリース モードでビルドすると、python27_d.lib 依存関係も削除されます。少なくとも私自身のプロジェクトではそうでした。

于 2013-07-31T15:57:42.673 に答える
0

無視されたライブラリに「python27_d.lib」(引用符なし)を追加してみてください:

構成プロパティ -> リンカー -> 入力 -> 特定のライブラリを無視

于 2013-11-05T11:31:52.127 に答える
0

Python シンボルを追加すると、プロジェクトが解決することがわかりました。このようにしてください

また、python27.lib を python27_d.lib という名前のファイルにコピーしました

于 2013-07-16T17:45:49.483 に答える