windows下用swig实现python调用C\C++的方法

来源:互联网 发布:直播实时转播软件 编辑:程序博客网 时间:2024/05/16 12:20

用swig实现python调用C\C++的方法

本文技术平台:win7,vs2010,python2.7(64位)

1.下载swig

在[www.swig.org]官网上下载相应的安装包,下载后解压安装包到任意路径,注意:路径中最好不要带空格。这样swig便可以使用

2.c++源文件和swig接口文件,文件如下:

example.h

/* example.h */#ifndef EXAMPLE_H#define EXAMPLE_H//void cHelloWorld();int compute(int a, int b);#endif

example.cpp

/* example.cpp */#include <iostream>#include "example.h"using namespace std;int compute(int a, int b){    int temp = (a+b)*(a-b);    return temp;}

example.i(swig接口文件)

/* File : example.i */%module example%inline %{#include "example.h"%}int compute(int a,int b);

这里都是c++格式的文件,也可为C语言文件。

3.生成部分文件

将example.h,example.cpp,example.i文件内容复制到txt文件中,改成相应格式,复制到swig文件中。
打开win7下开始—程序—附件—命令提示符
先把swig加入环境变量才能用swig的语句
命令提示符下,进入swig文件,使用’swig -c++ -python example.i‘,生成example_wrap.cxx和example.py两个文件。
如果是C语言的话就是‘swig -python example.i’

4. 配置Visual Studio 2010

我说一下在VS中的配置方法:
(1)新建项目,选择win32控制台应用程序,在下一步中选择空白项,输出为DLL。
(2)向Header Files中加入example.h,向Source File中加入example.cpp和example_wrap.cxx,向工程中加入example.i,这是可能会弹出一个对话框,我选的是’否’。
(3)然后在VS中project>Properties中点Configuration Manager,设置Configration为Release,Platform为Win32。如果为64位,则选择X64,否则程序会报错。错误如下所示:

error LNK2001: 无法解析的外部符号 __imp__Py_Initialize,该符号在函数 _main 中被引用

(4)下面在包含目录中引入python.h的路径(我的是D:\python27\include), 在库目录中引入python27.lib和python27_d.lib的路径(我的是D:\python27\libs), 如果没有python27_d.lib,就把python27.lib复制一份改个名字。

(5)最后Build Solution,在Release文件夹中会生成example.dll,把它改名成_example.pyd。把example.py,_example.pyd和测试文件放到python文件夹中测试。

可能出现的问题:
如果在vs 200x 下 debug 模式出现链接问题:

extmodule.obj : error LNK2001: unresolved external symbol __imp___Py_Dealloc referenced in function _PySwigObject_format

主要是因为 Py_DEBUG/Py_TRACE_REFS 引起, 修改 Python\include 下的 pyconfig.h, object.h 两个文件就行了

1. 修改 pyconfig.h 修改 #ifdef _DEBUG # define Py_DEBUG #endif #ifdef _DEBUG //# define Py_DEBUG #endif 修改# ifdef _DEBUG # pragma comment(lib,"python24_d.lib") # else # pragma comment(lib,"python24.lib") # endif /* _DEBUG */ # ifdef _DEBUG # pragma comment(lib,"python24.lib") # else # pragma comment(lib,"python24.lib") # endif /* _DEBUG */ 2. object.h 修改 #if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) #define Py_TRACE_REFS #endif #if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) // #define Py_TRACE_REFS #endif

5.python中测试

测试文件:

#!/usr/bin/env python# -*- coding: cp936 -*-# runme.pyfrom __future__ import divisionimport exampleprint('this is the test running.\n')aa = example.compute(5,2)print aaraw_input("press the enter key to exit.")
0 0
原创粉丝点击