[英]zig externs when using zig test for wasm
我有一個 Zig 代碼庫,我正在使用 build.zig 將其編譯為 WebAssembly,如下所示:
const std = @import("std");
pub fn build(b: *std.build.Builder) void {
const mode = b.standardReleaseOptions();
const lib = b.addSharedLibrary("main", "src/main.zig", b.version(0, 0, 0));
lib.setBuildMode(mode);
lib.setTarget(.{.cpu_arch = .wasm32, .os_tag = .freestanding});
lib.setOutputDir("web/dist");
b.default_step.dependOn(&lib.step);
}
在src/main.zig
中,有一個extern
標記了通過 WebAssembly 導入提供的 function。
extern fn printString(message: [*]u8, length: usize) void;
這在瀏覽器中運行時工作正常,但我試圖向項目添加測試,但每當我嘗試在main.zig
(或任何帶有extern
的文件)上運行zig test
時,我都會收到以下 linker 錯誤。
MachO Flush... error(link): undefined reference to symbol '_printString'
可能值得指出的是,我的test "..." {}
塊中沒有任何內容實際上涉及這些extern
函數中的任何一個。
在測試期間是否有一種明智的方法可以鏈接到這些外部變量的替代實現? 或者任何其他允許我編寫測試的解決方法?
您可以結合使用@import("builtin").is_test
和usingnamespace
在測試期間為外部函數創建存根。
const builtin = @import("builtin");
pub usingnamespace if (!builtin.is_test) struct {
pub extern fn printString(message: [*]u8, length: usize) void;
} else struct {
pub fn printString(message: [*]u8, length: usize) void {
_ = message;
_ = length;
}
}
pub usingnamespace
使 struct 的所有成員成為模塊公共結構的一部分,並且在測試期間我們只使用不依賴任何外部函數的不同結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.