使用 SWIG 为 Python 包装 C++。 'vector' 未申报
Using SWIG to wrap C++ for Python. 'vector' not declared
我正在尝试包装一个创建 3D 向量的 C++,以便我可以从 Python 调用它并可视化数据。我正在尝试使用 SWIG 包装,但是当我这样做时,我收到了错误消息
'vector’ was not declared in this scope
并已将 "vector" 包含到我能想到的每个文件中 我不确定我必须做什么才能包含它。我已经创建了一组非常基本的测试函数来尝试查看问题出在哪里,它与我尝试的真实代码大致相似 运行.
test.cpp
#include <vector>
#include <iostream>
using namespace std;
vector<int> testfunction(vector <int>& value){
cout <<"Running\n";
return value;
}
test.h
#ifndef TEST_H_ // To make sure you don't declare the function more than once by including the header multiple times.
#define TEST_H_
#include <vector>
#include <iostream>
vector<int> testfunction(vector <int>& value);
test.i
/*test.i*/
%module test
%{
#include "test.h"
#include <vector>
%}
vector<double> testfunction(vector<double> value);
为了编译我使用以下
g++ -g -ggdb -c -std=c++0x -I /include/python2.7 -o run test.cpp
swig -c++ -python test.i
gcc -fpic -c test.cpp test_wrap.cxx -I /include/python2.7
gcc -shared test.o test_wrap.o -i _test.so
谁能告诉我哪里错了?
我找到了这个问题的答案,我将 post 更新后的代码放在这里。问题有两个:
- SWIG 的 example.i 文件是错误的,关键是需要包含 "std_vector.i"
- 编译命令需要更多标志。
下面应该编译 运行.
example.h
#ifndef TEST_H_
#define TEST_H_
#include <vector>
#include <iostream>
std::vector<int> testfunction(std::vector <int>& value);
#endif
example.cpp
#include <vector>
#include <iostream>
std::vector<int> testfunction(std::vector <int>& value){
std::cout <<"Running\n";
return value;
}
example.i
%module example
%{
#include "example.h"
%}
%include "std_vector.i"
// Instantiate templates used by example
namespace std {
%template(IntVector) vector<int>;
%template(DoubleVector) vector<double>;
}
// Include the header file with above prototypes
%include "example.h"
生成文件
全部:
g++ -g -ggdb -std=c++0x -I include/python2.7 -o run example.cpp example_run.cpp
swig -c++ -python example.i
gcc -fpic -c example.cpp example_wrap.cxx -I include/python2.7
gcc -Wl,--gc-sections -fPIC -shared -lstdc++ example.o example_wrap.o -o _example.so
Python 通话:
>>> import example as ex
>>> iv=ex.IntVector(1)
>>> ex.testfunction(iv)
矢量快乐!
我正在尝试包装一个创建 3D 向量的 C++,以便我可以从 Python 调用它并可视化数据。我正在尝试使用 SWIG 包装,但是当我这样做时,我收到了错误消息
'vector’ was not declared in this scope
并已将 "vector" 包含到我能想到的每个文件中 我不确定我必须做什么才能包含它。我已经创建了一组非常基本的测试函数来尝试查看问题出在哪里,它与我尝试的真实代码大致相似 运行.
test.cpp
#include <vector>
#include <iostream>
using namespace std;
vector<int> testfunction(vector <int>& value){
cout <<"Running\n";
return value;
}
test.h
#ifndef TEST_H_ // To make sure you don't declare the function more than once by including the header multiple times.
#define TEST_H_
#include <vector>
#include <iostream>
vector<int> testfunction(vector <int>& value);
test.i
/*test.i*/
%module test
%{
#include "test.h"
#include <vector>
%}
vector<double> testfunction(vector<double> value);
为了编译我使用以下
g++ -g -ggdb -c -std=c++0x -I /include/python2.7 -o run test.cpp
swig -c++ -python test.i
gcc -fpic -c test.cpp test_wrap.cxx -I /include/python2.7
gcc -shared test.o test_wrap.o -i _test.so
谁能告诉我哪里错了?
我找到了这个问题的答案,我将 post 更新后的代码放在这里。问题有两个:
- SWIG 的 example.i 文件是错误的,关键是需要包含 "std_vector.i"
- 编译命令需要更多标志。
下面应该编译 运行.
example.h
#ifndef TEST_H_
#define TEST_H_
#include <vector>
#include <iostream>
std::vector<int> testfunction(std::vector <int>& value);
#endif
example.cpp
#include <vector>
#include <iostream>
std::vector<int> testfunction(std::vector <int>& value){
std::cout <<"Running\n";
return value;
}
example.i
%module example
%{
#include "example.h"
%}
%include "std_vector.i"
// Instantiate templates used by example
namespace std {
%template(IntVector) vector<int>;
%template(DoubleVector) vector<double>;
}
// Include the header file with above prototypes
%include "example.h"
生成文件
全部:
g++ -g -ggdb -std=c++0x -I include/python2.7 -o run example.cpp example_run.cpp
swig -c++ -python example.i
gcc -fpic -c example.cpp example_wrap.cxx -I include/python2.7
gcc -Wl,--gc-sections -fPIC -shared -lstdc++ example.o example_wrap.o -o _example.so
Python 通话:
>>> import example as ex
>>> iv=ex.IntVector(1)
>>> ex.testfunction(iv)
矢量快乐!