由python导入的python错误



我正在制作一个c++类来管理与设备(SPI)的通信。我们的想法是在Arduino和树莓派上使用这个c++类。这样我只需要创建这个类一次。

我将在Arduino上使用该类(这没有问题)。我还想在我的树莓派上使用它和python。(这就是问题所在)

我已经创建了一个测试类(矩形)来使用它。这次成功了:)

现在我碰到了我真正的班级的一个问题。

我的想法是使一个namespace与2类里面(一个public,一个private)。public用于管理设备的通信。private用于管理设备所需的SPI总线。

现在我想用mikem的bcm2835类制作SPI类,这就是我得到错误的地方。(http://www.airspayce.com/mikem/bcm2835/) .

我制作的下一个文件(我知道,它仍然是公开的): Device.h

namespace device {
    class Spi {
        public:
            int speed, modus;
            Spi(int speed, int modus);
            ~Spi();
            void openSpi();
            void closeSpi();
            void writeSpi(int dataToWrite);
            int readSpi();
    };
}

Device.cpp

#include "Device.h"
#include “bcm2835.h”
#include <iostream>
using namespace device;
//###############################################################################################
//***********************************************************************************************
//      Constructors:
//                      Default constructor: speed = 1MHz, modus = 0
//                      Specific constructor: speed = var(int), modus = var(int)
//***********************************************************************************************
//Specific
Spi::Spi(int speed, int modus) {
    speed = speed;
    modus = modus;
}
//Default
Spi::~Spi() {
}
//###############################################################################################
void Spi::openSpi() {
    if (!bcm2835_init())
    {
      std::cout<< "bcm2835_init failed." ;
      //return 1;
    }
    std::cout << "SPI is open.";
}
void Spi::closeSpi()
{
    std::cout << "SPI is closed.";
}
void Spi::writeSpi(int dataToWrite) {
    std::cout << "SPI write: " << dataToWrite;
}
int Spi::readSpi() {
    return 0;
}

dev.pyx

cdef extern from "Device.h" namespace "device":
    cdef cppclass Spi:
        Spi(int, int) except +
        int speed, modus
        void openSpi()
        void closeSpi()
        void writeSpi(int)
        int readSpi()
cdef class PySpi:
    cdef Spi *thisptr
    def __cinit__(self, int speed, int modus):
        self.thisptr = new Spi(speed, modus)
    def __dealloc__(self):
        del self.thisptr
    def openSpi(self):
        self.thisptr.openSpi()
    def closeSpi(self):
        self.thisptr.closeSpi()
    def writeSpi(self, data):
        self.thisptr.writeSpi(data)
    def readSpi(self):
        return self.thisptr.readSpi()

setup . py

from distutils.core import setup, Extension
from Cython.Build import cythonize
setup(ext_modules = cythonize(Extension(
        "dev",
        sources=["dev.pyx","Device.cpp"],
        language="c++",
    )))

在构建时没有出现错误,但是当我在python中执行"import dev"时。我得到错误:

未定义符号:bcm2835_init

有谁知道我做错了什么吗?

bcm2835_init可能位于"bcm2835.cpp"中,因此您需要将其添加到"setup.py"中的sources

sources=["dev.pyx","Device.cpp","bcm2835.cpp"]

或者,如果您已经编译了bcm2835库,您可能希望通过添加"setup.py"来链接到它

libraries = ["bcm2835"]

你会得到错误,因为它调用函数(在"Device.cpp"),但从未提供函数的定义

相关内容

  • 没有找到相关文章

最新更新