2016-08-17 2 views
0

Я создаю класс C++ для управления связью с устройством (SPI). Идея состоит в том, чтобы использовать этот класс C++ на Arduino и Raspberry Pi. Таким образом, мне нужно сделать этот класс только один раз.ошибка cython при помощи импорта python

Я буду использовать класс на Arduino (это не проблема). Я также хочу использовать его на моей малине Pi вместе с питоном. (Вот проблема)

Я уже сделал тестовый класс (Rectangle), чтобы использовать его для обоих. Этот был успешным :)

Теперь я наткнулся на проблему с моим настоящим классом.

Моя идея состояла в том, чтобы сделать namespace с 2 классами внутри (один public, один private). public один для управления связью устройства. private один для управления шиной SPI, необходимой для устройства.

Теперь я хочу сделать класс SPI с классом bcm2835 от mikem, вот где я получаю сообщение об ошибке. (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++", 
    ))) 

Я не получаю ошибки при строительстве, но когда я делаю «импорт Dev» внутри питона. Я получаю сообщение об ошибке:

undefined symbol: bcm2835_init

Кто-нибудь знает, что я делаю неправильно?

ответ

0

bcm2835_init предположительно в «bcm2835.cpp», так что вам нужно добавить, что sources в «setup.py»

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

В качестве альтернативы, если у вас есть bcm2835 библиотека уже скомпилированные вы можете перейти по ссылке это путем добавления к «setup.py»

libraries = ["bcm2835"] 

вы получаете ошибку, потому что вы вызываете функцию (в «Device.cpp»), но никогда не дает определения функции.

Смежные вопросы