经过了近一周的努力,总算能够成功地将sample程序成功的交叉编译出来了。
本篇只针对如何成功交叉编译,解决我遇到的问题而设立的。重点是交叉编译的流程
这边我在mac上利用parallel部署了ubuntu虚拟机。为了重新确认一遍步骤,我重新装了一台机器并重头进行了一遍步骤。并故意重现了我这几天碰到过的错误及解决办法,可能可以帮助到各位。
这边需要以下内容:
将rk3308板子内的oem内BDSpeechSDK目录复制到虚拟机内。可以进行adb pull /oem/BDSpeechSDK指令download下来
随后将sdk放到虚拟机。我这里就直接放在了home根目录
rk3308的编译在标准linux上是编不出来的。我们这里需要用到交叉编译工具链,这是一个特殊的编译器,可以认为是在A平台编译出B平台才能运行的工具包。
然后将交叉编译链也复制到虚拟机里
基于目前创建日期为4月23日的quick_start.md中所述
进入到sdk的sample目录,在终端输入如下命令:
mkdir my_specch_project
cd my_speech_projects
touch Makefile
mkdir src
touch src/main.cpp
创建如下的目录结构:
my_speech_project/
├── Makefile
└── src
└── main.cpp
我们到sample目录下,创建project文件夹并创建src目录,创建指定的文件
sample/asr/wakeup/src中的e2e_wp_asr_test.cpp和在quick_start.md中都有相应的demo代码,这里我就直接将wakeup/src中的sample代码拷贝到这里替换main.cpp
这里先不做任何改动,就照搬就行。目前的第一目的是尽快正确交叉编译并成功在板子上跑起来
makefile可以帮助工程快速连接编译,他能省掉很多功夫。由于本人不是纯正的c++开发工程师,所以这里copy了quick_start.md中的makefile代码
#make src=src/***.cpp
FILE_NAME=$(src)
SYS_ROOT=$(sr)
TARGET=$(basename $(notdir $(FILE_NAME)))
#build
CXX=arm-rockchip-linux-gnueabihf-g++
INCLUDE=-I../../include -I../../include/ASR -I../../include/TTS -I../../extern/include -I../../extern/include/longconnect
CPPFLAGS=-Wall -fopenmp -O2 -fPIC -g -D__LINUX__ -Wl,-rpath=../../lib,--disable-new-dtags,--copy-dt-needed-entries -Wl,-rpath=../../extern/lib,--disable-new-dtags -L../../lib -lBDSpeechSDK -L../../extern/lib -lzlog -llongconnect -lnghttp2 -lcurl -lssl -lcrypto -lz -lAudioEncoder -liconv -lAudioDecoder -lhttpDNS -lbd_alsa_audio_client -lgomp -lrt -ldl -lpthread
ifneq ($(strip $(SYS_ROOT)),)
MY_SYS_ROOT=--sysroot=$(SYS_ROOT)
endif
SRC_PATH=./src
SRC_FILE=$(shell cd $(SRC_PATH)&&echo *.cpp)
SRC=$(foreach n,$(SRC_FILE),$(SRC_PATH)/$(n))
$(TARGET):$(SRC)
$(CXX) -o $(TARGET) ./$(FILE_NAME) $(MY_SYS_ROOT) $(INCLUDE) $(CPPFLAGS)
#clean
LIST_ALL_FILES=$(shell find . -maxdepth 1)
SOURCES=. ./Makefile ./src
RM_FILES=$(filter-out $(SOURCES),$(LIST_ALL_FILES))
clean:
-rm -rf $(RM_FILES)
这里容易出现的第一个问题:
照搬后由于缩进,当你ctrlCV时,极有可能将缩进一起复制过来,所以这里需要将代码缩进都去除,保持整洁。在后面编译时我会演示出现缩进的错误提示,这里我继续保持原有的格式。
在quick_start.md中编译部分,要求我们配置完成后,在Makefile所在的目录执行
export PATH=path-to-cross-compiler-root/host/bin:$PATH
make FILE_NAME=src/main.cpp SYS_ROOT=path-to-cross-compiler-root/host/arm-rockchip-linux-gnueabihf/sysroot
这里 path-to-cross-compiler-root需要替换成我们工具链的根目录/bin即可
/host其实就是我们工具链的根目录
那在我这样的目录环境,等效替换成了
export PATH=/home/parallels/rk3308_arm_tool_chain/bin:$PATH
make FILE_NAME=src/main.cpp SYS_ROOT=/home/parallels/rk3308_arm_tool_chain/arm-rockchip-linux-gnueabihf/sysroot
这里会出现很多问题。如果上方的操作跟我一样,那你也很有可能碰到这些问题!
由于特殊缩进导致的makefile编译错误
错误具体提示如下
经过我多次测试,我打了很多空行也会错在第18行这里。后来解决的方法就是将缩进全部去除就可以了!
这个错误是因为缺少alsa的so库导致的。这个错误也被写在了quick_start.md中
如果遇到类似 ld: 找不到 -lbd_alsa_audio_client的错误,请开发者自行从官网下载alsa服务包或自行从开发套件中/ome/目录下提取相关库放到工程下参与链接即可。
这边我们从oem目录中pull一个文件下来。他在/oem目录下,名为libbd_alsa_audio_client.so。将它复制到BDSpeechSDK/lib下,这个目录专门放外部依赖的库文件,这个也放这里吧。
然后再次尝试编译,没有任何错误提示了,编译通过
然后在Makefile的同目录上就可以看到一个main的可执行程序了。这个程序是可以在rk3308的环境下执行的。将它通过adb放到板子里。这里提醒下,tmp目录在断电后会清洗。
(这里省略adb push ./main /tmp的过程)
我们的main也依赖于alsa的服务,所以在这里直接将alsa设置成开机启动得了。
/oem/Rklunch.sh 这个文件就是rk3308板子开机后会跑的一个执行文件,我们可以把所有需要在开机时启动的东西,都写在这个文件里,这样板子下次就会帮我们自动启动alsa了
这里新增了几行代码,主要是改一下目录权限,然后运行alsa服务
但是这一次还是没有启动的,需要自己手动启动一下alsa。启动方式就是上面5句话。
启动alsa后我们去启动main
cd /tmp/
LD_LIBRARY_PATH=/oem:/oem/BDSpeechSDK/lib:/oem/BDSpeechSDK/extern/lib ./main
如果看到这个输出,那么我们离成功不远了。但是其中有一句输出影响了整个程序。这不是编译问题!
error:5, domain:38, desc:Wakeup: dat file invalid., sn:
这里意思是没成功载入dat文件。
我们看一下代码。在wakeup_config函数中,可以看到它配置dat文件的路径,是…/…/resources/esis_resource.pkg
只要把这个层级改成绝对路径,或者把路径改短 ./esis_resource.pkg,并把pkg文件拷贝过来即可
然后重新编译,adb push到tmp下,这里省略
记得把dat文件也push到tmp下,如果跟我的改法一样的话
然后再次执行main
可以发现唤醒进入回调激活了引擎加载和启动唤醒。
我们这时候可以尝试使用了.
小度小度,今天上海天气如何?
至此已经完成了demo项目工程的交叉编译工作。
这只是默认sample程序编译出来的效果喔,还有很多隐藏功能带解锁。
这是我7天来的努力成果,如果这篇文章对你有所帮助,请给一个赞吧~