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

在 Configuration Properties->C/C++->Preprocessor->Preprocessor Definitions 中添加 MS_NO_COREDLL 定义;或在包含 python.h 之前添加 #define MS_NO_COREDLL 行。

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

如果您查看 Python 安装的 libs 目录,我怀疑您会找到 python27.lib 而不是 python27_d.lib。我相信 _d.lib 是 Python 库的调试版本,而您的 Python 安装没有包含它。在其他地方,我看到它建议解决此问题的最简单方法是下载 Python 源代码并自己构建发布和调试版本,但我从未尝试过。或者,更改您的构建以使用 Python .lib 的发布版本。您应该能够调试自己的代码,但不能调试 Python 代码。

于 2012-07-03T14:24:48.520 回答
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

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 平台上编译包装器的调试版本时,我们只需定义SWIG_PYTHON_INTERPRETER_NO_DEBUG标志即可避免pyconfig.hKen 的回答中提到的文件问题。

于 2015-09-17T13:19:18.747 回答
2

在 Release 模式下构建项目也会删除 python27_d.lib 依赖项;至少它为我自己的项目做了。

于 2013-07-31T15:57:42.673 回答
0

我发现添加 Python 符号可以解决这个问题。这样

我还将 python27.lib 复制到一个名为 python27_d.lib 的文件中

于 2013-07-16T17:45:49.483 回答
0

您可以尝试将“python27_d.lib”(不带引号)添加到被忽略的库中:

配置属性 -> 链接器 -> 输入 -> 忽略特定库

于 2013-11-05T11:31:52.127 回答
0

我通过执行以下操作解决了丢失的 python27_d.lib:

  • 将 python27.lib 复制到 python27_d.lib
  • 在 pyconfig.h 中注释掉define Py_DEBUG
于 2017-05-03T16:22:43.633 回答