std :: to_chars编译,但未在MacOS / clang上链接

问题描述 投票:0回答:1

我在使用clang的MacOS下编译项目时遇到问题。

我确实确定了charconv标头中的问题:

#include <charconv>
#include <array>
#include <iostream>

int main(){
    std::array<char, 64> buffer;

    auto[p, ec] = std::to_chars(buffer.begin(), buffer.end(), 123);

    if (ec != std::errc() )
        std::cout << "error" << '\n';

    std::cout << (const char *) buffer.data() << '\n';
}

这里是我的编译方式。

Nikolays-MacBook-Air:~ nmmm$ clang --version
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Nikolays-MacBook-Air:~ nmmm$ clang -std=c++17 x.cc -lstdc++
Undefined symbols for architecture x86_64:
  "std::__1::__itoa::__u32toa(unsigned int, char*)", referenced from:
      std::__1::__itoa::__traits_base<unsigned int, void>::__convert(unsigned int, char*) in x-9b1746.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Nikolays-MacBook-Air:~ nmmm$ 

任何帮助将不胜感激。

更新

我尝试了clang ++,但它给了我同样的错误消息。

c++ macos clang++ llvm-clang undefined-symbol
1个回答
0
投票

我为此写了一个很好的长答案,然后检查并确定它对我有用(Linux上为clang 9.0.0)。您使用clang而不是clang++进行编译。长答案如下:

Clang的libc ++长时间未完全实现“基本字符串转换,修订版5”(如to_charsfrom_chars中所述),并且某些部分仍然很出色,请参阅here。但是我认为您应该可以使用,因此也许您应该更新库。

to_chars的用法,请考虑它在字符串的末尾显式添加no \0。因此,您不能只使用std::cout << (const char *) buffer.data();。您必须使用指针(在代码中命名为p)标记字符串的结尾。通过插入\0,通过使用std::string_view sv(buffer.data(), static_cast<size_t>(p-buffer.data());生成std::copy(buffer.begin(), p, std::ostream_iterator<char>(std::cout, ""));或其他方法太多。]

© www.soinside.com 2019 - 2024. All rights reserved.