在共享库中使用 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()
而且有效!
我的项目是用 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()
而且有效!