在shared-lib中使用python的c ++代码来控制LCD

时间:2015-05-18 19:57:19

标签: python c++ shared-libraries ctypes raspberry-pi2

我的项目是在我的Raspberry B2上控制带有ST7565控制器的LCD 我正在尝试使用这个控制lcd的c ++代码: https://github.com/stephanel/ST7565-RPi

不幸的是我不熟悉用C编程,因为我想用ctypes从python调用c ++函数。

我写了一个简单的(对我而言)c ++代码用作共享库

lcdcontrol.cpp:

#include <iostream>
#include <ctime>
#include <sstream>
#include <wiringPi.h>
#include <wiringShift.h>
#include "ST7565/ST7565.cpp"

using namespace std;
ST7565 glcd(PIN_SID, PIN_SCLK, PIN_A0, PIN_RST, PIN_CS);

void start();
void drawclock();
void setpix();
void clear();
void drawstring();
void drawbitmap();

void start(){
    glcd.begin(0x18);
    glcd.display();}

void setpix() {
    glcd.setpixel(10, 10, BLACK);}

void clear() {
    glcd.clear();}

void drawstring() {
    glcd.drawstring(0, 0, "Test string");}

我的python代码用于测试:

#!/usr/bin/python
import os
from ctypes import *
from thread import start_new_thread

lcd_lib = cdll.LoadLibrary("lcdcontrol.so")
mylcd = lcd_lib

mylcd.start()

现在我必须将我的c ++代码编译为共享库。我尝试了几种方法。但没有问题没有任何作用。 当我运行python代码时,它返回它无法找到“digitalwrite”函数,它是布线lib的一部分,或者我得到一个错误,它无法找到“启动”函数。

请有人帮帮我。我对此疯狂...... 也许有一种完全不同的方式来使用python的ST7565 c ++代码。但这对我来说似乎是最简单的方法......直到现在......

2 个答案:

答案 0 :(得分:0)

因为你不熟悉C,我认为你犯的错误和我做的一样。你不需要关心C ++中的名字管理。

请参阅http://en.wikipedia.org/wiki/Nm_%28Unix%29

请说明如何导出这些功能。

可在此处找到更多信息:Python: accessing DLL function using ctypes -- access by function *name* fails

答案 1 :(得分:0)

感谢您的帮助,它有效!

这是我使用的makefile:

all:
    g++ -fPIC -shared -o lcdcontrol.so -I/usr/local/include -L/usr/local/lib -lwiringPi lcdcontrol.cpp
    sudo cp lcdcontrol.so /usr/lib/lcdcontrol.so

nm lcdcontrol.so返回:

     (...)
     U digitalWrite
     (...)
     00002968 T _Z10drawstringv
     00002a04 t _Z41__static_initialization_and_destruction_0ii
     0000293c T _Z5clearv
     00002834 T _Z5startv
     000028cc T _Z6setpixv
     0000bab6 b _ZL10xUpdateMax
     0000bab5 b _ZL10xUpdateMin
     0000bab8 b _ZL10yUpdateMax
     (...)

在我的python代码中,我现在可以使用:

mylcd._Z5startv()
mylcd._Z6setpixv()
mylcd._Z10drawstringv()

它有效!