2016-08-17 4 views
0

私は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にそれを追加する必要があるので、

答えて

0

bcm2835_initは、すでにコンパイルbcm2835ライブラリを持っている場合は、にリンクしたい場合があり、「bcm2835.cpp」でおそらくまた

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

です(「Device.cpp」で)、それはあなたが関数を呼び出すので、あなたがエラーを取得している「setup.py」

libraries = ["bcm2835"] 

に追加することが、決して関数の定義を提供することによってそれ。

関連する問題