OK536N-C在PC-Ubuntu开发环境搭建及创建自己的项目(含qt_demo编译错误解决方案)
-
总结
在使用OK536N-C的sdk搭建环境时总体是非常顺利的,只是qt_demo折腾了一下。希望飞凌的团队能看到并更新SDK压缩包.
PC准备开发环境
先下载到源码
OKT536-linux-sdk.tar.bz2比较大,被分成了6个子压缩包:
truedei@truedei-code:1-源码$ ls -l 总计 10747185 -rwxrwxrwx 1 root root 372 5月 16 20:48 md5sum.txt -rwxrwxrwx 1 root root 2147483648 5月 16 21:04 OKT536-linux-sdk.tar.bz2.00 -rwxrwxrwx 1 root root 2147483648 5月 16 21:02 OKT536-linux-sdk.tar.bz2.01 -rwxrwxrwx 1 root root 2147483648 5月 16 21:03 OKT536-linux-sdk.tar.bz2.02 -rwxrwxrwx 1 root root 2147483648 5月 16 21:03 OKT536-linux-sdk.tar.bz2.03 -rwxrwxrwx 1 root root 2147483648 5月 16 21:05 OKT536-linux-sdk.tar.bz2.04 -rwxrwxrwx 1 root root 267695134 5月 16 21:05 OKT536-linux-sdk.tar.bz2.05 truedei@truedei-code:1-源码$
如果你害怕搞没,不想重新下载的话,可以先备份下:
truedei@truedei-code:1-源码$ cd .. truedei@truedei-code:2-镜像及源码$ cp -arf 1-源码 1-源码_bak
可以使用md5sum校验:
truedei@truedei-code:1-源码$ cat md5sum.txt 81a2f7adbe52c3768eee4096aca3fefa OKT536-linux-sdk.tar.bz2.00 0ae30ee64b0fd44b5c8b563b0eff2d59 OKT536-linux-sdk.tar.bz2.01 9204b1fbfdc347864766fefe574f8b94 OKT536-linux-sdk.tar.bz2.02 2efca04ab16c43a2efe7c1cd68c85644 OKT536-linux-sdk.tar.bz2.03 3ebdef7248d268109b8617d5f83717ce OKT536-linux-sdk.tar.bz2.04 bc29ad68a624664439d2cea2e1634694 OKT536-linux-sdk.tar.bz2.05 truedei@truedei-code:1-源码$ truedei@truedei-code:1-源码$ truedei@truedei-code:1-源码$ md5sum OKT536-linux-sdk.tar.bz2.0* 81a2f7adbe52c3768eee4096aca3fefa OKT536-linux-sdk.tar.bz2.00 0ae30ee64b0fd44b5c8b563b0eff2d59 OKT536-linux-sdk.tar.bz2.01 9204b1fbfdc347864766fefe574f8b94 OKT536-linux-sdk.tar.bz2.02 2efca04ab16c43a2efe7c1cd68c85644 OKT536-linux-sdk.tar.bz2.03 3ebdef7248d268109b8617d5f83717ce OKT536-linux-sdk.tar.bz2.04 bc29ad68a624664439d2cea2e1634694 OKT536-linux-sdk.tar.bz2.05 truedei@truedei-code:1-源码$
解压多个被分割的压缩包时,需要先合并:
cat OKT536-linux-sdk.tar.bz2.0* > OKT536-linux-sdk.tar.bz2
然后解压tz2:
bunzip2 OKT536-linux-sdk.tar.bz2 #得到: 22G 5月 16 21:40 OKT536-linux-sdk.tar
会得到.tar,再继续解压.tar:
tar -xvf OKT536-linux-sdk.tar
解压完整个目录22G:
truedei@truedei-code:1-源码$ du -sh OKT536-linux-sdk 22G OKT536-linux-sdk truedei@truedei-code:1-源码$
然后拷贝不是中文的目录:例如我的:/media/truedei/soft/Ok536N-C
truedei@truedei-code:1-源码$ cp -arf OKT536-linux-sdk ../../../../
我是觉得解压一次不容易,还是cp过去一份比较好,虽然多占了22GB的空间,但是相对安全,例如某个操作破坏了当前的sdk内容,你还可以节省前面所有的操作。
初探经验:最好赋予下权限,不然build.sh时会报权限不足:
truedei@truedei-code:OKT536-linux-sdk$ chmod o+w ./ -R truedei@truedei-code:OKT536-linux-sdk$
调用时报:
/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/build/mkcmd.sh: line 750: python: command not found
原因是我系统中只有python3,没有低版本的python
ubuntu24.04这样解决:
sudo apt install python-is-python3
先编译配置:
sudo ./build.sh config
然后直接执行./build.sh编译
truedei@truedei-code:OKT536-linux-sdk$ ./build.sh 05-17 01:15:26.517 31732 D mkcommon : ========ACTION List: build_linuxdev;======== 05-17 01:15:26.519 31732 D mkcommon : options : 05-17 01:15:26.520 31732 I mkcommon : ---------------------------------------- 05-17 01:15:26.521 31732 I mkcommon : build linuxdev ... 05-17 01:15:26.522 31732 I mkcommon : chip: sun55iw6p1 05-17 01:15:26.523 31732 I mkcommon : platform: linux 05-17 01:15:26.525 31732 I mkcommon : kernel: linux-5.10-origin 05-17 01:15:26.526 31732 I mkcommon : board: OKT536-C 05-17 01:15:26.527 31732 I mkcommon : output: /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot 05-17 01:15:26.528 31732 I mkcommon : ---------------------------------------- 05-17 01:15:26.554 31732 I mkcommon : build rtos ...
buildroot编译不过去:
05-17 01:36:23.072 56507 I mkcommon : build buildroot ... make: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/buildroot-202205' You seem to have the current working directory in your LD_LIBRARY_PATH environment variable. This doesn't work. make[1]: *** [support/dependencies/dependencies.mk:27: dependencies] Error 1 make: *** [Makefile:96: _all] Error 2 make: Leaving directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/buildroot-202205' 05-17 01:36:28.549 56507 E mkcommon : build buildroot Failed 05-17 01:36:28.550 56507 F mkcommon : build_buildroot_rootfs failed truedei@truedei-code:OKT536-linux-sdk$
LD_LIBRARY_PATH environment variable. This doesn't work.
说我的环境中存在LD_LIBRARY_PATH变量。
先临时解决下:
truedei@truedei-code:OKT536-linux-sdk$ echo $LD_LIBRARY_PATH /home/truedei/local/lib: truedei@truedei-code:OKT536-linux-sdk$ truedei@truedei-code:OKT536-linux-sdk$ export LD_LIBRARY_PATH="" truedei@truedei-code:OKT536-linux-sdk$ echo $LD_LIBRARY_PATH truedei@truedei-code:OKT536-linux-sdk$
为了节省时间,这次可以单独编译rootfs:
因为我遇到了权限问题,所以加了sudo
truedei@truedei-code:OKT536-linux-sdk$ sudo ./build.sh buildroot_rootfs
成功之后是这样的:
media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/buildroot-202205 build auto finish 05-17 03:14:42.112 94974 I mkcommon : copy the config files form device ... make: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/platform' Makefile:35: "----------1--------" Makefile:36: /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/platform make: Nothing to be done for 'INSTALL_FILES'. make: Leaving directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/platform' 05-17 03:14:42.139 94974 I mkcommon : build buildroot OK. truedei@truedei-code:OKT536-linux-sdk$
如果你执行build.sh成功的话是这样的:
05-17 07:53:53.660 46608 D mkcommon : Number of gids 1 05-17 07:53:53.661 46608 D mkcommon : root (0) 05-17 07:53:53.663 46608 I mkcommon : pack rootfs ok ... 05-17 07:53:53.664 46608 I mkcommon : ---------------------------------------- 05-17 07:53:53.666 46608 I mkcommon : build OK. 05-17 07:53:53.667 46608 I mkcommon : ---------------------------------------- truedei@truedei-code:OKT536-linux-sdk$ truedei@truedei-code:OKT536-linux-sdk$ truedei@truedei-code:OKT536-linux-sdk$ truedei@truedei-code:OKT536-linux-sdk$ truedei@truedei-code:OKT536-linux-sdk$ truedei@truedei-code:OKT536-linux-sdk$ sudo ./build.sh -j10
我还发现了一个问题,在编译qt_demo时,Makefile中的qmake路径是写死的:
cd browser/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/browser/browser.pro ) && make -f Makefile cd backlight/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/backlight/backlight.pro ) && make -f Makefile cd adc/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/adc/adc.pro ) && make -f Makefile make[1]: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/musicplayer' /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile musicplayer.pro make[1]: /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake: No such file or directory make[1]: *** [Makefile:282: Makefile] Error 127 make[1]: Leaving directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/musicplayer' make: *** [Makefile:111: sub-musicplayer-make_first] Error 2 make: *** Waiting for unfinished jobs.... make[1]: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/watchdog' /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile watchdog.pro make[1]: /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake: No such file or directory make[1]: *** [Makefile:276: Makefile] Error 127
报错的路径:
/home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake
正确的路径:
/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake
导致该问题的原因:
现在我在刚解压过的原始sdk中,没做过任何编译:
truedei@truedei-code:qt_demo$ pwd /media/truedei/soft/Ok536N-C/doc/OK536x-C_Linux5.10.198+Qt5.15.8_用户资料_R1/2-镜像及源码/1-源码/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo truedei@truedei-code:qt_demo$
发现已经生成了.qmake.stash和Makefile:
truedei@truedei-code:qt_demo$ ls -alh 总计 177K drwxrwxrwx 1 root root 4.0K 2月 13 19:08 . drwxrwxrwx 1 root root 0 2月 13 17:49 .. drwxrwxrwx 1 root root 4.0K 2月 13 19:08 4g drwxrwxrwx 1 root root 4.0K 2月 13 19:08 adc drwxrwxrwx 1 root root 4.0K 2月 13 19:08 backlight drwxrwxrwx 1 root root 4.0K 2月 13 19:08 books drwxrwxrwx 1 root root 28K 2月 13 19:08 browser drwxrwxrwx 1 root root 0 2月 13 19:08 DWKeyboard -rwxrwxrwx 1 root root 338 2月 13 17:49 examples.pro -rwxrwxrwx 1 root root 34 2月 13 17:49 .gitignore drwxrwxrwx 1 root root 4.0K 2月 13 19:08 keypad -rwxrwxrwx 1 root root 84K 2月 13 19:08 Makefile drwxrwxrwx 1 root root 4.0K 2月 13 19:08 matrix-browser drwxrwxrwx 1 root root 4.0K 2月 13 19:08 musicplayer drwxrwxrwx 1 root root 4.0K 2月 13 19:08 network drwxrwxrwx 1 root root 4.0K 2月 13 19:08 ping_test -rwxrwxrwx 1 root root 2.1K 2月 13 17:49 .qmake.stash drwxrwxrwx 1 root root 4.0K 2月 13 19:08 rtc drwxrwxrwx 1 root root 4.0K 2月 13 19:08 spitest drwxrwxrwx 1 root root 4.0K 2月 13 19:08 terminal drwxrwxrwx 1 root root 4.0K 2月 13 19:08 watchdog drwxrwxrwx 1 root root 4.0K 2月 13 19:08 wifi truedei@truedei-code:qt_demo$ truedei@truedei-code:qt_demo$ cat .qmake.stash QMAKE_CXX.QT_COMPILER_STDCXX = 201402L QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 10 QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3 QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 1 QMAKE_CXX.COMPILER_MACROS = \ QT_COMPILER_STDCXX \ QMAKE_GCC_MAJOR_VERSION \ QMAKE_GCC_MINOR_VERSION \ QMAKE_GCC_PATCH_VERSION QMAKE_CXX.INCDIRS = \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include/c++/10.3.1 \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include/c++/10.3.1/aarch64-none-linux-gnu \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include/c++/10.3.1/backward \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc/aarch64-none-linux-gnu/10.3.1/include \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc/aarch64-none-linux-gnu/10.3.1/include-fixed \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/include QMAKE_CXX.LIBDIRS = \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc/aarch64-none-linux-gnu/10.3.1 \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/lib64 \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/lib64 \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib64 \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/lib \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/lib \ /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib truedei@truedei-code:qt_demo$ truedei@truedei-code:qt_demo$ find ./ -name "Makefile" ./4g/Makefile ./adc/Makefile ./backlight/Makefile ./books/Makefile ./browser/Makefile ./keypad/Makefile ./Makefile ./matrix-browser/Makefile ./musicplayer/Makefile ./network/Makefile ./ping_test/Makefile ./rtc/Makefile ./spitest/Makefile ./terminal/Makefile ./watchdog/Makefile ./wifi/Makefile truedei@truedei-code:qt_demo$
随便打开一个Makefile看下心里就有数了:
排查的最终解决方案:
清理掉qt_demo的所有Makefile和.qmake.stash。
truedei@truedei-code:qt_demo$ find ./ -name "Makefile" ./4g/Makefile ./adc/Makefile ./backlight/Makefile ./books/Makefile ./browser/Makefile ./keypad/Makefile ./Makefile ./matrix-browser/Makefile ./musicplayer/Makefile ./network/Makefile ./ping_test/Makefile ./rtc/Makefile ./spitest/Makefile ./terminal/Makefile ./watchdog/Makefile ./wifi/Makefile truedei@truedei-code:qt_demo$ ###删除: truedei@truedei-code:qt_demo$ find ./ -name "Makefile" -delete truedei@truedei-code:qt_demo$ find ./ -name "Makefile" truedei@truedei-code:qt_demo$ truedei@truedei-code:qt_demo$ ###删除qmake的缓存 truedei@truedei-code:qt_demo$ rm -rf .qmake.stash truedei@truedei-code:qt_demo$
这个问题的关键在与:
- 1.我认为飞凌的团队在提供原始代码的时候,应该清理掉该项目编译生产的.o,Makefile,qt的stash文件;
- 2.shell脚本可以优化下:
现在的:
cd 4g/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/4g/4g.pro ) && make -f Makefile
会出现的问题:
test -e Makefile命令会检测是否存在Makefile,如果存在就不执行后面的语句重新生产了;
其实去掉test -e Makefile或者把||改成&&(感觉改成&&就起不到什么作用了,和检查不检查没区别)。
写这个脚本的作者应该是这样想的:
- 用户初次生产之后,就不让再次生成了,编译时可以节省时间;
创建自己的项目
这个牵扯到项目放在哪里,想知道放在哪里合适,就需要熟悉项目的整体架构。
砍下这个目录:
truedei@truedei-code:auto$ pwd /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto truedei@truedei-code:auto$ truedei@truedei-code:auto$ ls -l 总计 32 drwxrwxrwx 1 root root 0 2月 13 17:49 allwinner -rwxrwxrwx 1 root root 5347 5月 18 19:44 build.sh drwxrwxrwx 1 root root 0 2月 13 17:49 forlinx -rwxrwxrwx 1 root root 4024 5月 18 15:08 makefile_cfg drwxrwxrwx 1 root root 0 2月 13 17:49 qt-demo -rwxrwxrwx 1 root root 5797 2月 13 17:49 ReadMe.md drwxrwxrwx 1 root root 4096 2月 13 17:49 sdk_demo drwxrwxrwx 1 root root 4096 2月 13 19:08 sdk_lib truedei@truedei-code:auto$
可以打开OKT536-linux-sdk/buildroot/package/auto/build.sh研究下:
看得出来,这各forlinx就是飞凌新增的脚本片段。
我们可以把OKT536-linux-sdk/buildroot/package/auto目录当项目根目录,继续创建目录
我完全是把OKT536-linux-sdk/buildroot/package/auto/sdk_demo/usbcam_test拷贝过来了,改了个名字
build.sh脚本新增:
#########truedei######### echo "build $1 truedei ..." make -C $LICHEE_BUILDROOT_DIR/package/auto/truedei/ $1 if [ $? -ne 0 ]; then echo "build truedei fail ..." exit 1 else cp -rf $LICHEE_BUILDROOT_DIR/package/auto/truedei/bin/* $LICHEE_BR_OUT/target/usr/bin/ fi
Makefile需要修改下:
INSTALL_TRUEDEI_PATH变量是在auto目录下的makefile_cfg中定义的:
# 自定义自己的项目 INSTALL_TRUEDEI_PATH = $(PACKAGE_PATH)/truedei/bin
然后就可以编译了,为了省时间,可以直接到项目中编译即可:
truedei@truedei-code:truedei$ truedei@truedei-code:truedei$ pwd /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/truedei truedei@truedei-code:truedei$ truedei@truedei-code:truedei$ truedei@truedei-code:truedei$ truedei@truedei-code:truedei$ make -e /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/aarch64-none-linux-gnu-g++ -g -o truedei ./usbcam_test.o -L/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/sdk_lib generate truedei success!!! cp -f truedei /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/truedei/bin make finish!!! truedei@truedei-code:truedei$
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号