python imp的cython错误

2024-10-03 09:07:27 发布

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

我正在制作一个C++类来管理与一个设备(SPI)的通信。这个想法是使用这个C++类在阿杜伊诺和树莓PI。这样我只需要上一次课。你知道吗

我将在Arduino上使用这个类(这没有问题)。 我还想把它和python一起用在我的Raspberry Pi上。(问题来了)

我已经做了一个测试类(矩形)来在这两个类上使用它。这次成功了:)

现在我偶然发现了一个问题,我真正的类。你知道吗

我的想法是制作一个namespace,里面有两个类(一个public,一个private)。管理设备通信的public设备。用来管理设备所需的SPI总线的private。你知道吗

现在我想用mikem的bcm2835类创建SPI类,这就是我得到错误的地方。(http://www.airspayce.com/mikem/bcm2835/)。你知道吗

我制作的下一个文件(我知道,它仍然是公开的):设备.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();
    };
}

设备.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;
}

开发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()

设置.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”时会出错。我得到一个错误:

undefined symbol: bcm2835_init

有人知道我做错了什么吗?你知道吗


Tags: selfspidefnamespaceintspeedmodusvoid
1条回答
网友
1楼 · 发布于 2024-10-03 09:07:27

bcm2835_init大概在“bcm2835.cpp”中,所以您需要将其添加到sources中设置.py““

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

或者,如果您已经编译了bcm2835库,您可能希望通过添加到设置.py““

libraries = ["bcm2835"]

你得到这个错误是因为你调用了函数设备.cpp)但从不提供函数的定义。你知道吗

相关问题 更多 >