从零搭建嵌入式zig程序开发
从零搭建zig调用C
开发环境
wsl ubuntu20.04
zig 0.17.0-dev.813
目的
- 交叉编译程序并运行在 luckfox pico max板子上
- zig 调用c接口为以后在单片机上运行做准备
创建工程
mkdir helloworld cd helloworld zig init工程结构
.├── build.zig └── src ├── c.c ├── c.h ├── main.zig └── root.zigbuild.zip
const std=@import("std");pub fnbuild(b:*std.Build)void{//const target = b.standardTargetOptions(.{}); //默认配置,运行在x86-64平台上const target=b.standardTargetOptions(.{.default_target=.{.cpu_arch=.arm,.os_tag=.linux,//.abi = .gnueabihf, //这个可以编译,但不能运行在luckfox pico max上.abi=.musleabihf,},});const optimize=b.standardOptimizeOption(.{});const mod=b.addModule("foo",.{.root_source_file=b.path("src/root.zig"),.target=target,});const translate_c=b.addTranslateC(.{.root_source_file=b.path("src/c.h"),.target=target,.optimize=optimize,});const exe=b.addExecutable(.{.name="foo",.root_module=b.createModule(.{.root_source_file=b.path("src/main.zig"),.target=target,.optimize=optimize,.imports=&.{.{.name="foo",.module=mod},.{.name="c",.module=translate_c.createModule()},},.link_libc=true,}),});exe.root_module.addCSourceFile(.{.file=b.path("src/c.c"),});exe.root_module.addIncludePath(b.path("src"));b.installArtifact(exe);const run_step=b.step("run","Run the app");const run_cmd=b.addRunArtifact(exe);run_step.dependOn(&run_cmd.step);run_cmd.step.dependOn(b.getInstallStep());run_cmd.addPassthruArgs();const mod_tests=b.addTest(.{.root_module=mod,});const run_mod_tests=b.addRunArtifact(mod_tests);const exe_tests=b.addTest(.{.root_module=exe.root_module,});const run_exe_tests=b.addRunArtifact(exe_tests);const test_step=b.step("test","Run tests");test_step.dependOn(&run_mod_tests.step);test_step.dependOn(&run_exe_tests.step);}c.c
#include"c.h"voidhello(void){printf("hello\r\n");}intadd(int x,int y){returnx+y;}c.h
#include<stdio.h>#include<math.h>#include<stdlib.h>voidhello(void);intadd(int x,int y);main.zig
const c=@import("c");const std=@import("std");pub fnmain()!void{_=c.printf("Hello from C: %f\n",c.sqrt(2.0));c.hello();_=std.c.printf("hello\n");_=c.printf("add test is %d\n",c.add(1,2));}root.zig
//! By convention, root.zig is the root source file when making a package.const std=@import("std");const Io=std.Io;/// This is a documentation comment to explain the `printAnotherMessage` function below.////// Accepting an `Io.Writer` instance is a handy way to write reusable code.pub fnprintAnotherMessage(writer:*Io.Writer)Io.Writer.Error!void{trywriter.print("Run `zig build test` to run the tests.\n",.{});}pub fnadd(a:i32,b:i32)i32{returna+b;}test"basic add functionality"{trystd.testing.expect(add(3,7)==10);}开始编译
zig build编译后目录结构
.├── build.zig ├── src │ ├── c.c │ ├── c.h │ ├── main.zig │ └── root.zig └── zig-out └── bin └── foo查看可执行文件信息
file zig-out/bin/foo zig-out/bin/foo:ELF32-bit LSB executable,ARM,EABI5 version1(SYSV),statically linked,with debug_info,not stripped拷备目标板运行
chmod777foo ls-la foo-rwxrwxrwx1root root4478684Jan115:11foo./foo Hello from C:1.414214hello hello add test is3