如何将C++标准库合并到Zig程序中?

Amb*_*ion 13 zig

在阅读 zig 的文档时,我的印象是 zig 可以编译 C 和 C++ 代码。因此,我认为您可以通过导入 C++ 文件的头@cImportzig build成功。但是,我似乎无法让它适用于 C++ 库集成。

我首先创建我的项目,zig init-lib然后src/main.zig通过@cImport指令添加我的导入。具体来说,我@cInclude("hooks/hooks.h")是这个库的C++头文件。如果我zig build此时尝试这样做,构建会失败,无法找到标头。我通过修改为build.zig来解决这个问题lib.addIncludeDir("/usr/include/library")

由于这个 C++ 库现在正在被解析并使用 C++ 标准库,因此我收到的下一个错误zig buildstdexcept找不到标头。为了解决这个问题,我修改build.ziglib.linkSystemLibrary("c++").

最后,我现在遇到的错误是/path/to/zig-linux-x86_64-0.9.1/lib/libcxx/include/<files>. 我得到诸如unknown type name '__LIBCPP_PUSH_MACROS, unknown type name 'namespace', 或 之类的东西unknown type name 'template'。谷歌搜索,我能找到的唯一部分相关的事情是,这是由于 clang 对 .h 文件的默认解释是 C 文件,显然没有namespacetemplate关键字,但我不知道该怎么办知识。MacO 上的 LLVM - 标准文件 iosfwd 中的未知类型名称“模板”

有谁知道如何通过 zig 与 C++(非纯 C)库实际集成?

pfg*_*pfg 13

具体来说,我 @cInclude("hooks/hooks.h") 这个库的 C++ 头文件。

@cImport()用于将 C 头文件转换为 zig,以便无需编写绑定即可使用它们。不幸的是,它不支持 C++ 头文件。要使用 C++ 库,您必须为其编写 C 绑定,然后编写@cImport()这些标头。

// src/bindings.cpp
#include <iostream>

extern "C" void doSomeCppThing(void) {
    std::cout << "Hello, World!\n";
}
Run Code Online (Sandbox Code Playgroud)
// src/bindings.h
void doSomeCppThing(void);
Run Code Online (Sandbox Code Playgroud)
// build.zig
const std = @import("std");

pub fn build(b: *std.build.Builder) void {
    const target = b.standardTargetOptions(.{});

    const optimize = b.standardOptimizeOption(.{});

    const exe = b.addExecutable(.{
        .name = "tmp",
        .root_source_file = .{ .path = "src/main.zig" },
        .target = target,
        .optimize = optimize,
    });

    exe.linkLibC();
    exe.linkLibCpp();    
    exe.addIncludePath("src");
    exe.addCSourceFile("src/bindings.cpp", &.{});

    b.installArtifact(exe);
}
Run Code Online (Sandbox Code Playgroud)
// src/main.zig
const c = @cImport({
    @cInclude("bindings.h");
});

pub fn main() !void {
    c.doSomeCppThing();
}
Run Code Online (Sandbox Code Playgroud)