You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

树莓派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

火山引擎 最新活动