gpt4 book ai didi

python - SWIG Python undefined symbol 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:18 24 4
gpt4 key购买 nike

我正在尝试使用 SWIG 创建一个 *.so 文件以便在 Python 中进一步使用,但有些东西不起作用。

我有两个文件:数据收集器.h

#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 接口(interface)文件如下所示:

/* 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,我已经卡在了这一点上。我该如何解决这个问题?

最佳答案

我刚刚得到了同样的错误,终于弄清楚了原因。正如上面的人所说,当它说像你这样的未找到符号并给出未定义的函数名称“_Z9checkStopv”时,请始终检查 .cpp 文件中此函数的实现以及任何同名函数声明!

就我而言,我的 cpp 确实定义了我的“未找到的符号”构造函数,但在我的 .h 文件中,我有一个重载的 operator=(对于构造函数),它在 .cpp 文件中未定义。所以 swig 包装了默认构造函数(在 .cpp 中实现)和 operator=(未实现)。因此,在导入时,这个未实现的 operator= 会产生错误。希望这对您有所帮助!

关于python - SWIG Python undefined symbol 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23877267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com