树莓派Raspbian系统中Pharo 7找不到*.so共享库的位置咨询
解决Pharo 7在树莓派3B+上找不到AD7091R.so共享库的问题
我来帮你搞定这个Pharo调用自定义共享库的问题,结合树莓派3B+和Raspbian Stretch的环境,咱们一步步排查修复:
首先要明确一个基础前提:树莓派3B+是ARM64硬件,但Raspbian Stretch默认是32位系统,你用的Pharo 7也是32位版本,所以你的AD7091R.so必须是针对ARM 32位编译的——如果架构不匹配,哪怕路径放对了也会找不到。
接下来是核心的库存放与配置步骤:
1. 优先选择的标准存放路径
对于ARM 32位的Raspbian系统,自定义共享库最稳妥的位置是:
/usr/lib/arm-linux-gnueabihf/
这是系统为32位ARM库指定的标准目录,Pharo这类32位应用会优先在这里查找库文件。你之前放的/usr/local/lib也是合法路径,但需要后续的缓存刷新操作配合。
2. 刷新动态链接器缓存
不管你把库放在哪个标准路径,都得执行这条命令让系统更新库缓存,这样Pharo才能识别到你的库:
sudo ldconfig
执行完可以用下面的命令验证库是否被系统收录:
ldconfig -p | grep AD7091R
如果能输出库的路径信息,说明系统已经识别到了。
3. 修正Pharo代码中的库命名(关键细节)
Linux的动态链接器默认遵循libxxx.so的命名规范,看你提供的Pharo代码,你返回的模块名是AD7091R.so,这可能导致链接器找不到。有两种解决方式:
- 直接把你的库重命名为
libAD7091R.so,然后修改Pharo代码里的unix32ModuleName方法,返回'libAD7091R.so'; - 如果不想改名,就创建一个软链接指向原库:
sudo ln -s /usr/lib/arm-linux-gnueabihf/AD7091R.so /usr/lib/arm-linux-gnueabihf/libAD7091R.so
4. 临时测试方案(快速排查)
如果前面的步骤都试过还是不行,可以在启动Pharo时临时指定库的搜索路径,验证库本身是否能被识别:
LD_LIBRARY_PATH=/usr/lib/arm-linux-gnueabihf/ ./pharo
这样Pharo启动时会优先从这个路径查找共享库,能快速定位是路径问题还是库本身的问题。
额外排查点
- 检查库文件的权限:确保
AD7091R.so的权限是至少可读的(比如执行chmod 644 /usr/lib/arm-linux-gnueabihf/AD7091R.so),Pharo进程要有读取权限; - 验证库的架构:用
file AD7091R.so命令查看输出,确认是ARM 32位的,比如输出应该包含:ELF 32-bit LSB shared object, ARM, EABI5 version 1。
你提供的Pharo代码(格式化后)
'From Pharo7.0.1 of 25 February 2019 [Build information: Pharo-7.0.1+build.149.sha.890f474a81f116ead0e68c8de77790aef4e9a752 (32 Bit)] on 9 May 2019 at 2:29:46.092395 pm'! FFILibrary subclass: #AD7091RFFILibrary instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Manifold-AD7091R'! !AD7091RFFILibrary methodsFor: 'accessing platform' stamp: 'LesterLecong 5/9/2019 14:01'! unixModuleName "Kept for backward compatibility. Users should use unix32* or unix64*" ^ 'AD7091R.so'! ! !AD7091RFFILibrary methodsFor: 'accessing platform' stamp: 'LesterLecong 5/9/2019 11:49'! macModuleName ^ 'AD7091R.dylib'! ! !AD7091RFFILibrary methodsFor: 'accessing platform' stamp: 'LesterLecong 5/9/2019 11:50'! win32ModuleName ^ 'AD7091R.dll'! ! !AD7091RFFILibrary methodsFor: 'accessing platform' stamp: 'LesterLecong 5/9/2019 14:01'! unix32ModuleName "Kept for backward compatibility. Users should use unix32* or unix64*" ^ 'AD7091R.so'! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 12:01'! apiAD7091RDealloc: handle "int AD7091R_dealloc(AD7091R *p_instance)" ^ self ffiCall: #(int AD7091R_dealloc(AD7091RExternalObject handle))! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 12:13'! apiAD7091RData: handle pin: pin "iint AD7091R_data_pin(AD7091R *p_instance, uint8_t n_data_pin)" ^ self ffiCall: #(int AD7091R_data_pin(AD7091RExternalObject handle, int pin))! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 11:57'! apiAD7091RAlloc: handle "int AD7091R_alloc(AD7091R **pp_instance)" ^ self ffiCall: #(int AD7091R_alloc(AD7091RExternalObject *handle))! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 13:12'! apiAD7091RPins: handle convst: convstPin cs: csPin clk: clkPin data: dataPin "int AD7091R_pins(AD7091R *p_instance, uint8_t n_convst_pin, uint8_t n_cs_pin, uint8_t n_clk_pin, uint8_t n_data_pin)" ^self ffiCall: #(int AD7091R_pins(AD7091RExternalObject handle, int convstPin, int csPin, int clkPin, int dataPin))! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 12:14'! apiAD7091RBegin: handle "iint AD7091R_begin(AD7091R *p_instance)" ^ self ffiCall: #(int AD7091R_begin(AD7091RExternalObject handle))! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 12:11'! apiAD7091RClk: handle pin: pin "iint AD7091R_clk_pin(AD7091R *p_instance, uint8_t n_clk_pin)" ^ self ffiCall: #(int AD7091R_clk_pin(AD7091RExternalObject handle, int pin))! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 12:11'! apiAD7091RConvst: handle pin: pin "iint AD7091R_convst_pin(AD7091R *p_instance, uint8_t n_convst_pin)" ^ self ffiCall: #(int AD7091R_convst_pin(AD7091RExternalObject handle, int pin))! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 12:12'! apiAD7091RCs: handle pin: pin "iint AD7091R_cs_pin(AD7091R *p_instance, uint8_t n_cs_pin)" ^ self ffiCall: #(int AD7091R_cs_pin(AD7091RExternalObject handle, int pin))! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 12:16'! apiAD7091RData: handle "iint AD7091R_data(AD7091R *p_instance)" ^ self ffiCall: #(int AD7091R_data(AD7091RExternalObject handle))! ! !AD7091RFFILibrary methodsFor: 'api' stamp: 'LesterLecong 5/9/2019 12:16'! apiAD7091RReset: handle "iint AD7091R_reset(AD7091R *p_instance)" ^ self ffiCall: #(int AD7091R_reset(AD7091RExternalObject handle))!
内容的提问来源于stack exchange,提问作者Lester Lecong




