我在使用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 ++,但它给了我同样的错误消息。
我为此写了一个很好的长答案,然后检查并确定它对我有用(Linux上为clang 9.0.0)。您使用clang
而不是clang++
进行编译。长答案如下:
Clang的libc ++长时间未完全实现“基本字符串转换,修订版5”(如to_chars
和from_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, ""));
或其他方法太多。]