在共享库中使用python中的c++代码来控制LCD

using c++ code from python in a shared-lib to control an LCD

本文关键字:代码 c++ 控制 LCD 中的 python 共享      更新时间:2023-10-16

我的项目是用ST7565控制器控制我的树莓B2上的LCD我试图使用这个c++代码,控制lcd: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"函数,这是wiringpi库的一部分,或者我得到一个错误,它找不到"start"函数。

有谁能帮帮我吗?我要疯了……也许有一个完全不同的方式来使用ST7565 c++代码从python。但对我来说,这似乎是最简单的方法……直到现在…

因为你不熟悉C语言,我假设你犯了我曾经犯过的同样的错误。在c++中,你不需要关心名称混淆。

见http://en.wikipedia.org/wiki/Nm_%28Unix%29

请演示函数是如何导出的。

Python:使用ctypes访问DLL函数——通过函数*name*访问失败

谢谢你的帮助,它工作!

这是我使用的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

纳米lcdcontrol。所以返回:

     (...)
     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()

它有效!