从痛饮包裹CPP文件创建DLL(Creating a DLL from a wrapped cpp

2019-06-26 00:48发布

我在学习如何在Windows上使用痛饮的过程。

下面是我的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"

我已成功地缠上了我的C ++代码,在使用痛饮的Cygwin下面的命令:

  $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

我是相当新的使用痛饮所以任何帮助将不胜感激。

谢谢!

Answer 1:

如果你在你的Python安装的libs目录看,我怀疑你会发现一个python27.lib而不是python27_d.lib。 我相信_d.lib是Python库的调试版本和Python安装没有包括。 在其他地方我已经看到了它认为解决这个问题的最简单方法是下载Python源和建立自己的发行和调试版本,但我从来没有尝试过这一点。 或者改变你建立使用Python的.lib的发行版本。 您应该能够调试自己的代码,但不是Python代码即可。



Answer 2:

添加在配置属性> C / C ++ MS_NO_COREDLL定义 - > Preprocessor->预处理定义; 或包括python.h前添加的#define MS_NO_COREDLL线。

#define MS_NO_COREDLL
#include <Python.h>


Answer 3:

这个问题似乎是,不知什么原因,pyconfig.h强制使用特别命名的.lib文件的文件。 哎哟! 坦率地说,这看起来像我的错误 - 让程序员指定哪些文件.LIB使用! 不要强迫它!

在下面的代码,你可以简单的#ifdef 0整个事情,或重命名“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 */


Answer 4:

SWIG(至少在3.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.h在肯的回答中提到文件的问题。



Answer 5:

建立在Release模式项目删除python27_d.lib依赖性过; 至少它没有为我自己的项目。



Answer 6:

我发现addind Python的符号做的项目解决它。 做到像这个

我也复制了python27.lib到一个文件名为python27_d.lib



Answer 7:

你可以尝试添加“python27_d.lib”(不带引号)到忽略库:

配置属性 - >链接器 - >输入 - >忽略特定的图书馆



Answer 8:

我做了以下解决缺少python27_d.lib:

  • 复制python27.lib到python27_d.lib
  • 在pyconfig.h注释掉define Py_DEBUG


文章来源: Creating a DLL from a wrapped cpp file with SWIG
标签: python dll swig