我的目标是使用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”的类。 –