是否可以在 C++ 编译器模式下将标准 C++17 <filesystem> 设施与 Zig 一起使用?

Is it possible to use the standard C++17 <filesystem> facilities with Zig in C++ compiler mode?

我刚刚开始使用 Zig。我在 Windows 10 上使用 Zig 0.9.0。吸引我的功能之一是将 Zig 用作 C 或 C++ 编译器或交叉编译器。我已经成功地将 Zig 用于一些玩具程序,但是当我尝试使用 C++17 的标准库文件系统工具时,我的运气 运行 失败了。这是一个最小的例子;

#include <stdio.h>
#include <filesystem>

int main( int argc, char *argv[] )
{
    std::string s("src/zigtest.cpp");
    std::filesystem::path p(s); 
    bool exists = std::filesystem::exists(p);
    printf( "File %s %s\n", s.c_str(), exists ? "exists" : "doesn't exist" );
    return 0;
}

如果我尝试使用以下命令构建它;

zig c++ -std=c++17 src\zigtest.cpp

我收到以下 link 错误;

lld-link: error: undefined symbol: std::__1::__fs::filesystem::__status(std::__1::__fs::filesystem::path const&, std::__1::error_code*)
>>> referenced by ...

顺便说一句,很长一段时间我都没有走到这一步,结果我需要应用 -std=c++17 标志,直到那时我遇到了这个编译错误而不是 link 错误;

src\zigtest.cpp:7:10: error: no member named 'filesystem' in namespace 'std'

最后我会注意到(在谷歌搜索之后)我尝试传递一个 -lstdc++fs 标志,但也没有成功。在那种情况下我得到;

error(link): DLL import library for -lstdc++fs not found
error: DllImportLibraryNotFound

一些评论:您看到 std::__1::__fs::filesystem 的事实意味着您正在使用 libc++。

尝试 link 到 libstdc++fs 这是 gcc 的东西,即使你的系统上有它也不会工作。

您使用的是什么版本的 libc++? libc++ 的文档在这里:

他们谈论使用 <filesystem> 以及您必须 link 做什么(如果有的话)。

应该在这个PR中解决。 Jakub 和 Spex 在我将他们链接到这个问题后立即开始处理它 :^)

https://github.com/ziglang/zig/pull/10563