gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:19:23 27 4
gpt4 key购买 nike

在阅读 zig 的文档时,我的印象是 zig 可以编译 C 和 C++ 代码。因此,我认为您可以通过 @cImport 导入 C++ 文件的 header 。并且有 zig build成功。但是,我似乎无法将其用于 C++ 库集成。

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

由于现在正在解析此 C++ 库并使用 C++ 标准库,因此我在 zig build 时遇到下一个错误是stdexcept找不到 header 。为了解决这个问题,我修改了 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 文件,显然没有 namespace。或 template关键字,但我不知道如何处理这些知识。 LLVM on MacOs - unknown type name 'template' in standard file iosfwd

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

最佳答案

Specifically, I @cInclude("hooks/hooks.h") the C++ header file of this library.

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

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

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

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

const mode = b.standardReleaseOptions();

const exe = b.addExecutable("tmp", "src/main.zig");
exe.setTarget(target);
exe.setBuildMode(mode);

exe.linkLibC();
exe.linkSystemLibrary("c++");
exe.addIncludeDir("src");
exe.addCSourceFile("src/bindings.cpp", &.{});

exe.install();
}
// src/main.zig
const c = @cImport({
@cInclude("bindings.h");
});

pub fn main() !void {
c.doSomeCppThing();
}

关于zig - 如何将 C++ 标准库合并到 Zig 程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73467232/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com