【问题标题】:cython error by python importpython导入的cython错误
【发布时间】:2016-08-17 16:26:07
【问题描述】:

我正在创建一个 C++ 类来管理与设备 (SPI) 的通信。这个想法是在 Arduino 和 Raspberry Pi 上使用这个 C++ 类。这样我只需要做一次这门课。

我将使用 Arduino 上的课程(这没问题)。 我还想在我的 Raspberry Pi 上与 python 一起使用它。 (这里有问题)

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

现在我偶然发现了我真正的班级的一个问题。

我的想法是制作一个namespace,里面有两个类(一个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

有谁知道我做错了什么?

【问题讨论】:

    标签: python c++ cython


    【解决方案1】:

    bcm2835_init 大概在“bcm2835.cpp”中,因此您需要将其添加到“setup.py”中的sources

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

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

    libraries = ["bcm2835"]
    

    您收到错误是因为您调用了函数(在“Device.cpp”中)但从未提供函数的定义。

    【讨论】:

      猜你喜欢
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多