作者博客:bot7.cc
如果你的項目只是有一個相對簡單的代碼鳄乏,并不設(shè)計復(fù)雜的附加庫的話,直接使用SWIG轉(zhuǎn)化編譯就可以使用了棘利。具體教程請參考:C/C++轉(zhuǎn)化Python擴(kuò)展 - 簡單例子橱野。
但是,有很多時候我們的項目會相對復(fù)雜一些善玫,這時候如果能用IDE進(jìn)行編譯鏈接就會省事很多水援。像我的項目中用到了Qt的庫,而SWIG本身并不支持Qt的庫茅郎。解決的思路就是在外層再做一層封裝裹唆,只用標(biāo)準(zhǔn)庫來編寫入口的類文件,只是使用SWIG轉(zhuǎn)化最外層的這個類就可以了只洒。
用Qt Creator創(chuàng)建待轉(zhuǎn)化的項目
新建C/C++ Library項目Example许帐,選擇靜態(tài)庫。
添加一個簡單的類作為示例:
// example.h
#ifndef EXAMPLE_H
#define EXAMPLE_H
#include <iostream>
#include <QString>
class Example
{
private:
QString *m_str;
public:
Example();
void sayHello();
};
#endif // EXAMPLE_H
// example.cpp
#include "example.h"
using namespace std;
Example::Example()
{
m_str = new QString("Hello Python, we are Qt and C++!");
}
void Example::sayHello(){
cout << m_str->toLatin1().data() << endl;
}
在Example這個類中我們用到了Qt的庫毕谴。
選擇Release進(jìn)行編譯成畦,會生成相應(yīng)的庫文件, win下為.lib
,linux下為.a
距芬。
新建一個項目用來封裝Example類
利用Qt Creator新建一個C++ Library項目Warp, 選擇動態(tài)庫。
將上一步的example.h
文件和生成的libExample.a
(win下名字不同)文件復(fù)制到本項目目錄的lib文件夾中循帐。
在.pro
文件中添加包含路徑和庫:
INCLUDEPATH += lib \
"YOURPYTHONINCLUDEPATH"
LIBS += -Llib -lExample \
-L"YOURPYTHONINCLUDEPATH" -lpythonx.x # 根據(jù)你的Python版本配置
添加Warp類:
// warp.h
#ifndef WARP_H
#define WARP_H
class Example;
class Warp
{
private:
Example *m_example;
public:
Warp();
void sayHello();
};
#endif // WARP_H
// warp.cpp
#include "warp.h"
#include "example.h"
Warp::Warp()
{
m_example = new Example();
}
void Warp::sayHello(){
m_example->sayHello();
}
利用SWIG進(jìn)行轉(zhuǎn)化
編寫warp.i文件:
%module warp
%{
#include "warp.h"
%}
%include "warp.h"
運(yùn)行SWIG生成轉(zhuǎn)化文件:
swig -c++ -python warp.i
之后會生成warp.py
文件和warp_warp.cxx
文件框仔。
將warp_warp.cxx
文件添加到Warp項目當(dāng)中,選擇Release進(jìn)行編譯拄养,生成動態(tài)鏈接庫离斩。
將生成的動態(tài)鏈接庫改名為_warp.so
(win下后綴不同)。
此時即生成了所有所需的文件瘪匿,warp.py
, _warp.so
跛梗。
在Python中調(diào)用
此時已經(jīng)可以在上一步編譯輸出的目錄下使用Python擴(kuò)展了,使用import warp
導(dǎo)入即可棋弥。