私はC++クラスを作って、デバイス(SPI)との通信を管理しています。アイデアは、このC++クラスをArduinoとRaspberry Piで使用することです。このように私はこのクラスを1回だけ作る必要があります。Pythonインポートによるcythonエラー
私はArduinoでクラスを使用します(これは問題ありません)。 私はまた、私のラズベリーパイと一緒にそれをpythonで使いたいと思っています。 (ここに問題があります)
私はすでにテストクラス(Rectangle)を作成して両方で使用しています。これは成功しました:)
今私は本当のクラスの問題につきものになります。
私の考えは、と1つのprivate
の2つのクラスを持つnamespace
を作ることでした。デバイスの通信を管理するために1つはpublic
です。デバイスに必要なSPIバスを管理するために1つを選択します。
今、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()
構築しながら
from distutils.core import setup, Extension
from Cython.Build import cythonize
setup(ext_modules = cythonize(Extension(
"dev",
sources=["dev.pyx","Device.cpp"],
language="c++",
)))
setup.pyは、私はエラーを取得していないが、私はPythonの内部で「インポートDEV」を行うとき。私はエラー:
undefined symbol: bcm2835_init
私は間違って何を知っていますか?あなたは「setup.py」にsources
にそれを追加する必要があるので、