首页 > 其他分享 >#冲刺创作新星# #跟着小白一起学鸿蒙#[五]开源鸿蒙的4种编译方法

#冲刺创作新星# #跟着小白一起学鸿蒙#[五]开源鸿蒙的4种编译方法

时间:2022-10-08 12:02:00浏览次数:72  
标签:lib 鸿蒙 musl -- 新星 clang 编译 开源 arm

作者:王石,胡瑞涛

简介

在#跟着小白一起学鸿蒙# [二]第一个OpenHarmony程序章节我们学习了如何开发一个OpenHarmony的终端程序,采用的方法就是使用BUILD.gn脚本文件,通过./build.sh脚本进行编译,这也是OpenHarmony官方推荐的编译程序的方法。但是这样的方法牵扯方便广,速度慢,接下来我们来熟悉下OpenHarmony的另外两种编译方法。

GCC编译方法

  1. 工具链位置:

    [源码路径]/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/
    
  2. 编译命令:

    arm-linux-gnueabi-gcc -static helloworld.c -o gcchelloworld
    
  3. 方法解析:

    使用gcc工具链的编译方法是嵌入式开发的通用方法。但是这里有个特殊的地方-static。 gcc 加上 -static,会在链接阶段, 查找对应模块的静态库, 而非动态库, 并把需要的东西,都带进目标文件),编译好后,文件会非常大,但是,运行时就不需要依赖。这个原因则是在OpenHarmony的镜像文件里放的是musl的lib库,没有glibc的lib库,所以如果不用-static标志则有可能在运行时找其他运行库,找不到则运行不成功。

CLang编译方法

  1. 工具链位置:[源码路径]/prebuilts/clang/ohos/linux-x86_64/llvm/bin

  2. 编译命令:

    • clang --sysroot=[ohos代码路径]/out/rk3568/obj/third_party/musl/ --target=arm-linux-ohosmusl -D__clang__ -march=armv7-a -mfloat-abi=softfp -mfpu=neon-vfpv4 -w -o helloworld.c.o -c helloworld.c

    • clang --sysroot=[ohos代码路径]/out/rk3568/obj/third_party/musl/ --target=arm-linux-ohosmusl -D__clang__ -march=armv7-a -mfloat-abi=softfp -mfpu=neon-vfpv4 -w -Wl,--dynamic-linker,/lib/ld-musl-arm.so.1 -rdynamic helloworld.c.o -o muslhelloworld

  3. 方法解析:

    clang编译器是APPLE公司的编译器大牛Chris Lattner主导下编写的,其目标是替换大名鼎鼎的GCC编译器。一般编译器的流程如下:

    graph LR
    源代码 --> 预处理 --> 前端 --> 优化 --> 后端 --> 链接 --> 生成文件
    

    通过上面的命令分析分了两部,第一步编译生成中间文件:helloworld.c.o,也就是从预处理一直到后端的过程;第二步链接helloworld.c.o和/lib/ld-musl-arm.so.1生成目标文件muslhelloworld也就是链接和生成文件。这部分和上部分的区别就是手动引用musl库。那么musl库和glibc的库的区别是什么呢?

    1. 开源版本:glibc(LGPLv2.1),musl(MIT)
    2. 运行速度:glibc优于musl,同时稳定性也是glibc更好
    3. 代码可读性:musl优于glibc

总结

OpenHarmony的官方编译方法就是使用./build.sh脚本文件,调用顺序大致如下:

graph LR
build.sh --> entry.py --> vendor和product --> hb --> ninja --> clang

所以如果要缩减编译时间还有一些特殊方法:

  • ./build.sh --product-name 【产品名称如:rk3568】--ccache --build-target 【编译对象模块,如:moduleb_lib】

    此方法也是官方的一种编译方法,虽说只编译一个模块,但是流程是完整的,即:

    • 用BUILD.gn生成ninja文件,然后通过上面的流程编译最总的模块二进制文件
  • ninja -C /out/rk3568(根据编译的productname来填) moduleb_lib(编译对象模块,如:moduleb_lib)

    此方法的前提是首先用./build.sh编译过一遍,然后因为out目录里提前生成了build.ninja,所以可以直接用ninja命令直接编译对应模块

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com/#bkwz

标签:lib,鸿蒙,musl,--,新星,clang,编译,开源,arm
From: https://blog.51cto.com/harmonyos/5737146

相关文章

  • 分布式任务调度开源框架
    背景无论是互联网应用或者企业级应用,都充斥着大量的批处理任务。我们常常需要一些任务调度系统帮助我们解决问题。随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、......
  • 实验5:开源控制器实践——POX
    一、实验目的1.能够理解POX控制器的工作原理;2.通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;3.能够运用POX控制器编写自定......
  • VideoPipe可视化视频结构化框架开源了!
    完成多路视频并行接入、解码、多级推理、结构化数据分析、上报、编码推流等过程,插件式/pipe式编程风格,功能上类似英伟达的deepstream和华为的mxvision,但底层核心不依赖复......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的能够独立完成OpenDaylight控制器的安装配置能够使用Postman工具调用OpenDaylightAPI接口下发流表二、实验环境......
  • 实验5 开源控制器实践——POX
    实验5开源控制器实践——POX一、实验目的1.能够理解POX控制器的工作原理;2.通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;3......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的1.能够独立完成OpenDaylight控制器的安装配置;2.能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环......
  • 实验4:开源控制器实践——OpenDaylight
    (三)实验报告3.1请用Markdown排版;3.2基础要求需要提交两张图3.2.1一是Mininet拓扑生成并连接控制器的结果3.2.2二是Mininet中ping测试截图//APIJSON代码注入{......
  • 阿里巴巴开源限流组件Sentinel初探之集成Gateway
    1Sentinel主页​​github.com/alibaba/Sen…​​1.1Sentinel介绍随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式服务架构的流量控制组件,......
  • 实验5:开源控制器实践——POX
    (一)基础要求Hub模块h1pingh2h1pingh3l2_learning模块h1pingh2h1pingh3L2_learning模块代码流程图(二)进阶1.重新搭建(一)的拓扑,此时交换机内无流表规......
  • 开源电子书 nginx开发手册文档 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1_LZNQWmpQno988_QDY06Og点击这里获取提取码 ......