0

我的项目是在我的 Raspberry B2 上使用 ST7565 控制器控制 LCD 我正在尝试使用此 C++ 代码来控制 LCD: https ://github.com/stephanel/ST7565-RPi

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

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

液晶控制.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 lib的一部分,或者我得到一个错误,它找不到“start”函数。

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

4

2 回答 2

0

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

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

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

可以在此处找到其他信息:Python:使用 ctypes 访问 DLL 函数 -- 通过函数 *name* 访问失败

于 2015-05-18T20:56:49.950 回答
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()

它有效!

于 2015-05-19T14:04:23.553 回答