我的目标是使用 ctypes 从 Python 中调用我单独创建的 C++ 库,其中我通过指针将 numpy 向量传递给 C++ 例程。因此 Python 将分配内存并仅传递地址,然后 C++ 例程将访问数据并执行其计算并返回结果。
由于我是 ctypes 的新手,现在我正在逐步构建一个工作玩具示例。我开始编写 C++ 代码并创建 Python 包装器代码将使用的 C 外部接口。我什至还没有开始编写 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
持有指向数据的指针并且不复制数据。
当我尝试使用命令编译它时
g++ -c -fPIC foo.cpp -o foo.o
在我们的 Linux 机器上,我收到以下错误:
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&)
这对我来说似乎很清楚:它是说我在倒数第三行 (#26) 中调用 Data 构造函数的方式foo.cpp
与我在代码的 C++ 部分中编写的构造函数不一致。在 C++ 代码和 C extern 代码中,我想说输入是指向双精度向量/数组的指针。我在第 36 行尝试了其他选项,但仍然无法编译。
如何在 C++ 部分中仍然使用vector
类(在编写真正的算法时会发现它很有用)的同时编写 extern C 部分?我是否遇到了麻烦,因为vector
它是 STL 的一部分,它不适用于 extern C?
提前致谢。