我正在尝试使用SWIG创建一个*.so文件,以便在Python中进一步使用,但是有些东西不起作用。
我有两个文件: 数据采集器
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "gnublin.h"
#include <pthread.h>
class dataGatherer
{
private:
int threshold;
int timeThreshold;
int data[4096];
bool running;
gnublin_spi* spiDevice;
pthread_t spiThread;
void *params;
public:
dataGatherer(void);
dataGatherer(int, int);
void initData();
int getThreshold(void);
int* getData(void);
int getPeak(void);
void initSPI(void);
void gatherData();
void * run(void * arg);
void stop(void);
// for use of thread we have to implement some methods from C
static void * start_static(void * params)
{
dataGatherer * thread_this = static_cast<dataGatherer*>(params);
return thread_this->run(thread_this->params);
}
void start(void * params)
{
this->params = params;
pthread_create(&spiThread, 0, &dataGatherer::start_static, this);
}
};
和spiController.h
#include "dataGatherer.h"
class spiController
{
private:
bool runGather;
dataGatherer* gatherer;
int data[4096];
public:
spiController(void);
spiController(int, int);
void initData();
bool checkStop();
void stop();
void start();
};
我的spiController.i接口文件如下所示:
/* spiController.i */
%module spiController
%{
#include "dataGatherer.h"
#include "spiController.h"
#include "gnublin.h"
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
extern void initData();
extern bool checkStop();
extern void stop();
extern void start();
%}
extern void initData();
extern bool checkStop();
extern void stop();
extern void start();
最后,我尝试使用终端中的命令创建*.so文件,如SWIG页面上的示例:
swig -python -c++ spiController.i
c++ -c spiController_wrap.c -I/usr/include/python2.7
c++ -shared spiController_wrap.o -o _spiController.so
*.cxx、*.o和*.so文件的创建没有错误,但是当我将spiController导入到python代码中时,我得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "spiController.py", line 26, in <module>
_spiController = swig_import_helper()
File "spiController.py", line 22, in swig_import_helper
_mod = imp.load_module('_spiController', fp, pathname, description)
ImportError: ./_spiController.so: undefined symbol: _Z9checkStopv
这是我第一次尝试使用SWIG,我已经陷入了困境。我该怎么解决?
正如Adam的评论和我的经验一样,您应该首先将XXX.cpp文件编译成XXX.o,整个命令行可能如下所示:
1。swig-python-c++XXX.i
2。c++-c-fpic XXX.cpp(此命令将生成XXX.o文件)
3。c++-c-fpic XXX_wrap.cxx-I/usr/include/python2.7(此命令将生成XXX_wrap.o文件)
4。c++-共享XXX.o XXX_wrap.o-o XXX.so
您必须链接定义您已经声明为^ ^(CD<1}})的C++函数的库。您将在示例的编译步骤的第三行添加^ {< CD2>}。
像这样:
我也犯了同样的错误,终于弄明白了原因。如上所述,当它像您这样说unfunded符号并给出未定义的函数名''uz9checkstopv'时,请始终检查.cpp文件中此函数的实现以及任何同名的函数声明!!
在我的例子中,cpp确实定义了“unfound symbol”构造函数,但是在.h文件中,我有一个重载运算符=(用于构造函数),它在.cpp文件中未定义。所以swig包装了默认构造函数(在.cpp中实现)和operator=(未实现)。因此,当导入时,这个未实现的运算符=会产生错误。希望这有帮助!
相关问题 更多 >
编程相关推荐