powder shell上编写c++_第一个fuchsia上c++程序

7d299ff40fc688a64d13b77d83d884ba.png

第一个fuchsia上c++程序

在linux主机上 借助于qemu把fuchsia系统跑起来了,接下来就 搞个小程序在上面跑一跑吧

在fuchsia的源码树里已经有一些示例代码了,位于fuchsia/examples/下

b3f449d22d59ecc172db24eeaf2ff671.png

最简单的当然是hello_world的, 里面有个 c++版本和rust版本的hello world

79680d4c3704781f8759741c969c33dd.png

还真的只是hello_world

aa6b798a39594fe895878c0124df7d2d.png

我仿照这个hello_world,写个自己的小程序试试

编写代码

  • 在examples目录下 建立一个文件夹,命名为first
  • 创建一个http://first.cc文件,把简单的代码写了

531dc068cfd385ca8d4059d5b4dd34fb.png
  • 创建对应的编译gn文件, gn文件是生成ninja的配置, ninja是一套构建工具,而gn是元构建工具,生成ninja

5ef3227b88d1ed467463525f9659299b.png
  • 编写项目配置文件first_cpp.cmx,放到meta目录下, 官方说法是Component manifest, 作用类似android应用里的AndroidManifest.xml文件

6567937c18ec8ae644cd8b56cfce181c.png

编译应用程序

有两种方法编译应用程序,一是用fuchsia的sdk, 二是直接在源码树里编译应用

sdk的获取

可以直接下载一份sdk,但是要考虑到这个系统还在开发中,我们本地的fuchsia源码和下载的sdk不一定是完全匹配的。这时可以选择自己编译一份sdk, 用这个

 fx set core.x64 --args=build_sdk_archives=true
 fx build

参考

https://9to5google.com/2018/12/14/fuchsia-friday-sdk-download/

https://fuchsia.dev/fuchsia-src/development/sdk/download

在源码树里进行编译

首先需要将first包含进build,命令如下:

  • 在源码树下准备编译, 把工程加入到编译选项里,报错了

2cb04b5ec4bdc47fbc4a6ed7de2480e6.png


这个错误说明不能随意加一个包方法源码树里,它会检查这个包是否是在visibility list里。那如果我一定要的话,需要把first加入到visibility list里, 修改 build/BUILD.gn文件,格式是 路径+包

6b5ff8aa7a76674dcd2c7ee507665fe0.png


继续,这下成功了

bb68ac2448a14a326a78f09153f75444.png
  • 编译

672685dcf07314e25d4c070cb5564c05.png

运行

启动一个fx serve, 这个东西怎么理解呢, 它类似于 android开发的adb , PC机和android连接靠的是adb工具,adb会在PC机上运行一个server进程和android系统通信。 同理,和fuchsia系统通信就要用这个fx serve。

启动一个shell,执行如下命令:

 fx serve

这时候 阻塞在 discovery这里, 表示在等待fuchsia设备

9a94929f0c952bfc3f3deaeb720869aa.png

启动fuchsia, 在开一个shell窗口,执行如下命令

 fx qemu -N

这里的 -N表示启动网络, 必须要有的,不然无法fuchsia系统不会和 serve连接。

系统启动完毕后,就会发现 serve那个窗口是这样的,表示serve和qemui的fuchsia建立连接了。

b0e98288155cc6f1aca56dbe776dfe41.png

这时, 再开一个shell,窗口执行fx shell, 这个就类似android里的adb shell, 能够进入到fuchsia的shell

ac48d297c16b77e4fb32d0da56b7ba64.png

用locate命令查找下 first在哪里

用run命令执行

7f3b03cabf7c26068cc084a58e06d280.png

断点调试

fuchsia上有个叫zxdb的工具,用于调试c/c++程序。 参考 zxdb: Fuchsia native debugger

  • 另起一个shell,执行fx debug, 这个是启动了zxdb(类似gdb一样的调试器)
    fx debug
  • 把目标进程first添加到调试器的列表里, 这样当first启动时自动就attach上了。
    attach first
  • 给main函数上断点
    b main
  • 执行first
    fx shell run fuchsia-pkg://http://fuchsia.com/first_cpp#meta/first_cpp.cmx
  • 开始打断点和单步调试, 这个和gdb基本一样了

完成过程如图

c399d16a7d868166c4f8b3dde979107e.png

1e118340f849d213f5090692dec6e8ae.png

参考文档来自官方的fuchsia dev fuchsia debug

打印log

在fuchsia系统里,打印log的几种模式

  • the LogSink service,用户层的log打印
  • the kernel's debuglog, 内核的log打印
  • a combination of these, routed through stdout or stderr, 直接在终端输出

显然,我需要使用的是logsink service, 参考官方文档 Syslog

第一步, 要在Component manifest里加上依赖log service。

8965a4dacee8916fb63c8e02f2d41412.png

第二步, 在first的编译配置文件BUILD.gn,加上编译链接依赖(第16行)

9e92bb497cfbe10fcb875e13cb77e8e8.png

第三步,写代码吧, 注意要加的头文件

1b5f68cbf1ee6e5f37d6594c7ce18d8b.png

第四步, 分别是fx build编译和 fx shell run运行

8219596295f0e31b61ffdec45ebcb885.png

运行结束了, 去哪里看log呢? 查下官网, 用fx log, 默认情况下log tag是manifext文件的名,这里就是first_cpp.cmx了

7991a813655558a8f9243da0af42aca4.png

小结

这个新fuchsia系统很多操作其实和linux,android有类似的地方,使用起来也还算顺手。

比如 

  • debug工具和gdb类似;
  • fx log和android的adb logcat类似;
  • 包配置文件cmx和android 的AndroidManifext.xml类似;
  • 编译链工具用gn,更简单性能更好。这个编写比android.mk简单,性能目前还不好说。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值