【问题标题】:Is it possible to use the standard C++17 <filesystem> facilities with Zig in C++ compiler mode?是否可以在 C++ 编译器模式下将标准 C++17 <filesystem> 工具与 Zig 一起使用?
【发布时间】:2022-01-11 02:03:55
【问题描述】:

我刚刚开始使用 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

我收到以下链接错误;

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 标志,直到那时我遇到的是这个编译错误而不是链接错误;

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

【问题讨论】:

    标签: c++ c++17 zig


    【解决方案1】:

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

    试图链接到libstdc++fs 这是一个 gcc 的东西,即使你的系统上有它也行不通。

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

    他们谈论使用&lt;filesystem&gt; 以及您必须链接到什么(如果有的话)。

    【讨论】:

    • 感谢您的帮助。 Zig C++ 构建系统有点不透明(或者可能只是我不熟悉),而且似乎很难找出底层组件和版本是什么。对不起,我对 MSVC 比 GCC 或 Clang 更熟悉,这让我有点不便。无论如何,如果我使用 Zig C++ --version 我发现它是 Clang 13.0.1 (很新,对吧?)。我不知道我使用的是什么版本的 libc++,也不知道如何找到。如果我在上面查看您的 llvm.org 版本,似乎我应该不需要做任何特别的事情 (9,10) - 或者添加 -lc++fs (8)....(将添加另一条评论)
    • 由于之前绝望的谷歌搜索,我已经尝试过 -lc++fs - 结果与 -lstdc++fs 相同(即错误 - 用于 -lc+ 的 DLL 导入库) +fs 未找到)
    • 当我可以参考我自己的答案之一时,这很好:-)。 stackoverflow.com/questions/38441490/…
    • 谢谢,我今晚回家后会检查一下。我对此有一种不好的感觉,我的理论是 Zig C++ 编译链不是为 C++17 设置的,因为这个标准库的简单调用会打败它。一直有人告诉我,微软的编译器落后于标准委员会,但在 Visual Studio 上使用 多年来一直很容易。
    • #define _LIBCPP_VERSION 13000。所以releases.llvm.org/13.0.0/projects/libcxx/docs/UsingLibcxx.html 没有任何说明。但是releases.llvm.org/12.0.0/projects/libcxx/docs/UsingLibcxx.html 说“从 LLVM 9.0 开始,主库中提供了对 的支持,使用 不需要任何特殊要求。”看起来对 的支持现在如此深入,他们甚至不再提及它。嗯,越来越好奇了。
    【解决方案2】:

    应该在这个 PR 中解决。在我将这个问题联系起来后,Jakub 和 Spex 立即着手处理 :^)

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

    【讨论】:

    • 谢谢。具有讽刺意味的是,由于我试图在我的 Windows 机器上为我在 macOS(英特尔)上的朋友构建一个可执行文件,所以我可以继续(我猜)而不用担心这个(一旦我想出了如何重新定位等)。 - 不明显)我必须承认我现在很困惑,例如拉取请求谈到了 GNU 和 的东西在 MSVC 上不起作用(本身有点令人费解的 MS 工具对 没有问题)。我假设 Zig 一直在使用 Clang,但这里引用了 GCC(GNU?)和 MSVC。随着时间的推移我会弄清楚的。
    • 我已经决定使用运行 Ubuntu 18.04 的旧 Linux 机器可能会更容易,但实际上我在那里遇到了一个更糟糕的错误,这让我相信 Zig 还没有准备好迎接黄金时段这种事情。一个简单的交叉开发 C/C++ 编译器的想法很棒,并且实现很有希望——但它还远未实现。可能除了我以外的任何人都不会感到惊讶。我花了很多时间弄清楚为什么我的简单 C++ 程序会在 Linux 机器上崩溃,并最终将其缩小为一个令人惊叹的简单且可重现的问题,如下所示(另一条评论)
    • 在 Ubuntu 18.04LTS (zig 0.9.0) 上使用 zig c++ 构建时,下面非常简单的 C++ 程序只是在 m[5] = 6 行崩溃(非法操作)。如果您将 map 变量作为堆栈变量移动到 main() 中,则可以正常工作。也可以在 Windows 上按预期工作。请让我知道在其他地方报告问题是否有帮助,谢谢。 #include &lt;stdio.h&gt;#include &lt;map&gt;static std::map&lt;int,int&gt; m;int main(){m[5] = 6;printf( "m[5] = %d\n", m[5] );return 0;}
    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多