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

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

我的项目是用 ST7565 控制器在我的 Raspberry B2 上控制 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 编码时 returns 它找不到 "digitalwrite" 函数,它是 wiringpi 库的一部分,或者我得到一个错误找不到 "start" 函数。

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

因为你对C不熟悉,所以我假设你犯了和我犯过的错误一样的错误。您不关心 C++ 中的名称修改。

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

请说明函数是如何导出的。

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

感谢帮助,成功了!

这是我正在使用的 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.so returns:

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

而且有效!