3.2 编译hello程序
使用Clang时,我们要指定很多参数:为哪类CPU编译程序(ARM还是Risc-V),CPU架构是什么(cortex A7还是cortex A15),头文件/库文件在哪? 在为Liteos-a编译程序时,以hello程序为例,可以执行以下命令:
cd /home/book/doc_and_source_for_openharmony/apps/hello clang -target arm-liteos --sysroot=/home/book/openharmony/prebuilts/lite/sysroot/ \ -o hello hello.c
上述命令的sysroot参数中,指定有标准头文件、库文件的目录。
还可以像GCC一样使用“-I”、“-L”参数指定其他头文件的目录、库文件的目录,比如后面会编译这个程序:
cd /home/book/doc_and_source_for_openharmony/apps/freetype clang -target arm-liteos --sysroot=/home/book/openharmony/prebuilts/lite/sysroot/ \ -I /home/book/openharmony/third_party/freetype/include \ -L /home/book/openharmony/out/ipcamera_hi3518ev300/libs/usr \ -lfreetype \ -o show_line show_line.c
3.3 把hello程序放入rootfs
编译出hello程序后,可以把它放入rootfs目录下的bin字母,比如:
cd /home/book/doc_and_source_for_openharmony/apps/hello cp hello /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/bin
然后重新制作rootfs.jffs2,执行以下命令:
cd /home/book/openharmony/kernel/liteos_a/out/imx6ull/ mkfs.jffs2 -s 0x10000 -e 0x10000 -d rootfs -o rootfs.jffs2
假设hello程序位于/home/book/apps/hello目录下,操作截图如下:
把得到的rootfs.jffs2放到烧写工具的files目录,就可以使用烧写工具启动了:
进入命令行后,就可以执行hello程序了,如下图所示:
注意:必须用“./bin/hello”,不能用绝对路径“/bin/hello”
4. 编译其他APP
4.1 获取源码
我们提供了这几个程序:
放在GIT上,地址为:
https://e.coding.net/weidongshan/openharmony/doc_and_source_for_openharmony.git
为了方便,可以在Ubuntu中执行以下命令直接下载:
cd /home/book git clone https://e.coding.net/weidongshan/openharmony/doc_and_source_for_openharmony.git
这将会得到这个目录:/home/book/doc_and_source_for_openharmony
4.2 编译程序
假设已经下载得到/home/book/doc_and_source_for_openharmony目录,执行以下命令即可编译:
cd /home/book/doc_and_source_for_openharmony/apps for i in $(ls); do cd $i; make; cd -; done
解释以下上面的命令。 $(ls)里列出了这几个目录:digital_photo_frame fb_test freetype hello。 对于其中的每一项“$i”,执行(do)这些命令:
cd $i; make; cd -
就是进入该目录,执行make命令,退到上一级目录。 你当然可以自己进入那些子目录,手工执行make命令。
注意:
(1)freetype、digital_photo_frame这2个程序,需要使用到前面编译出来的hi3518ev300的库文件。
(2)所以需要先执行“python build.py ipcamera_hi3518ev300 -b debug”
(3)如果鸿蒙源码的路径不是/home/book/openharmony,那么需要修改Makefile,如下修改路径:
4.3 复制程序到rootfs
这2个程序不依赖其他动态库:hello、fb_test;
但是freetype程序依赖libfreetype.so、digital_photo_frame程序依赖libfreetype.so、libjpeg.so。
这几个动态库在哪?我们取个巧,之前在《1.2.4 编译官方版本》执行过“python build.py ipcamera_hi3518ev300 -b debug”,它为hi3518ev300开发板生成了这写库文件。hi3518ev300与imx6ull同属cortex A7架构,所以imx6ull可以使用这些库。以后完善imx6ull的代码后,就不需要这样取巧了。 执行以下命令复制程序:
cd /home/book/doc_and_source_for_openharmony/apps # 拷贝应用程序 cp hello/hello /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/bin cp fb_test/fb_test /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/bin cp freetype/show_line /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/bin cp digital_photo_frame/digitpic /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/bin # 拷贝字体文件 cp freetype/simsun.ttc /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/ # 拷贝数码相框的图标 cp digital_photo_frame/rootfs /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/ -rf # 拷贝库文件 cp /home/book/openharmony/out/ipcamera_hi3518ev300/libs/usr/libfreetype.so /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/usr/lib/ cp /home/book/openharmony/out/ipcamera_hi3518ev300/libs/usr/libjpeg.so /home/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/usr/lib/
4.4 制作rootfs.jffs2
执行以下命令:
cd /home/book/openharmony/kernel/liteos_a/out/imx6ull/ mkfs.jffs2 -s 0x10000 -e 0x10000 -d rootfs -o rootfs.jffs2
把得到的rootfs.jffs2放到烧写工具的files目录,就可以使用烧写工具启动了:
4.5 执行APP
这些APP,可以直接执行,如果需要参数的话,它会提示用法。
注意:必须用相对路径,比如“./bin/hello”;不能用绝对路径,比如“/bin/hello”
4.5.1 fb_test
执行以下命令:
./bin/fb_test /dev/fb0
效果如下:
4.5.2 show_line
执行以下命令:
./bin/show_line /simsun.ttc 230 230 100
效果如下:
4.5.3 digitpic
执行以下命令:
./bin/digitpic /simsun.ttc
可以点击屏幕上的图标,效果如下: