我的目標是使用ctypes從Python中調用一個C++庫,我分別創建了一個C++庫,我通過指針將numpy向量傳遞給C++例程。因此,Python將分配內存並傳遞地址,然後C++例程將訪問數據並執行計算並返回結果。使用C++的「extern C」和ctypes向量
因爲我是ctypes的新手,現在我正在逐步構建一個工作玩具的例子。我將開始編寫C++代碼並創建Python封裝代碼將使用的C extern接口。我甚至還沒有開始Python包裝代碼,但已經有了一些這方面的經驗。
這是我的例子,它包含一個構造函數和一個簡單的總函數。
// foo.cpp //
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Data {
public:
Data(vector<double>*);
void PrintTotal(void);
private:
vector<double>* myContents;
};
Data::Data(vector<double>* input) {
std::cout << "Entered constructor in C++" << std::endl;
myContents = input;
}
void Data::PrintTotal(void) {
double total = 0;
for (int i=0; i<myContents->size(); i++){
total += (*myContents)[i];
}
std::cout << "Hello, my total is " << total << std::endl;
}
extern "C" {
Data* Data_new(double (**input)) {return new Data(input);}
void Print_Total(Data* pData) {pData->PrintTotal();}
}
請特別注意,我正在使用STL的矢量類,這可能是下面描述的問題的一部分。這個想法是類Data
持有一個指向數據的指針,並不複製數據。
當我嘗試編譯是使用我們的Linux機器上的命令
g++ -c -fPIC foo.cpp -o foo.o
,我得到以下錯誤:
foo.cpp: In function âData* Data_new(double**)â:
foo.cpp:26: error: no matching function for call to âData::Data(double**&)â
foo.cpp:13: note: candidates are: Data::Data(std::vector<double, std::allocator<double> >*)
foo.cpp:6: note: Data::Data(const Data&)
這似乎非常清楚對我說:它說的方式我在foo.cpp
的倒數第三行(#26)中調用Data構造函數並不符合我在代碼的C++部分編寫的構造函數。在C++代碼和C extern代碼中,我試圖說輸入是一個指向雙精度向量/數組的指針。我嘗試了#36行的其他選項,但它仍然不能編譯。
如何在C++部分仍然使用vector
類(我將在編寫真正的算法時會發現它很有用)時編寫extern C部分?我遇到麻煩了,因爲vector
是STL的一部分,它不適用於extern C?
在此先感謝。
如果您希望'Date_new'和'Print_total'函數在C程序中可用,那麼這將不起作用。即使使用extern「C」,C程序也不能使用類似「Data」的類。 –