SWIG Python未定义的symb

2024-06-16 11:56:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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,我已经陷入了困境。我该怎么解决?


Tags: 文件soincludeexternparamsthisstartint
3条回答

正如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>}。

像这样:

c++ -L<path to DLL> -l<name of your dll> -shared spiController_wrap.o -o _spiController.so

我也犯了同样的错误,终于弄明白了原因。如上所述,当它像您这样说unfunded符号并给出未定义的函数名''uz9checkstopv'时,请始终检查.cpp文件中此函数的实现以及任何同名的函数声明!!

在我的例子中,cpp确实定义了“unfound symbol”构造函数,但是在.h文件中,我有一个重载运算符=(用于构造函数),它在.cpp文件中未定义。所以swig包装了默认构造函数(在.cpp中实现)和operator=(未实现)。因此,当导入时,这个未实现的运算符=会产生错误。希望这有帮助!

相关问题 更多 >