我的项目是在我的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 ++代码。但这对我来说似乎是最简单的方法......直到现在......
答案 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()
它有效!