标签: libc++

libc ++和libstdc ++之间的istream eof差异

当与libstdc ++和libc ++链接时,以下(玩具)程序返回不同的东西.这是libc ++中的错误还是我不明白istream eof()是如何工作的?我尝试在linux和mac os x上使用g ++并在mac os x上运行它,使用和不使用-std = c ++ 0x.我的印象是,在尝试读取(通过get()或其他东西)实际上失败之前,eof()不会返回true.这就是libstdc ++的行为方式,而不是libc ++的行为方式.

#include <iostream>
#include <sstream>

int main() {
    std::stringstream s;

    s << "a";

    std::cout << "EOF? " << (s.eof() ? "T" : "F") << std::endl;
    std::cout << "get: " << s.get() << std::endl;
    std::cout << "EOF? " << (s.eof() ? "T" : "F") << std::endl;

return 0;
}

Thor:~$ g++ test.cpp
Thor:~$ ./a.out
EOF? F
get: 97
EOF? F
Thor:~$ clang++ -std=c++0x -stdlib=libstdc++ test.cpp 
Thor:~$ …
Run Code Online (Sandbox Code Playgroud)

c++ istream libstdc++ libc++

8
推荐指数
2
解决办法
1195
查看次数

clang ++ 3.2链接器没有找到C++ stdlib

我在我的Ubuntu 13.04机器上安装了clang 3.2,并编译和构建了libc ++,一切都已就绪.但是,当我尝试链接我的(非常简单的)代码时,链接器报告对std :: cout等的引用是未定义的.

如果有人能告诉我我能做些什么来解决这个问题,我会非常感激 - 我已经尝试了所有我能想到的东西.

命令和输出在这里:

$ clang++ -v -stdlib=libc++ -lpthread -ldl sqlite3/sqlite3.o src/world.o -o bin/world

Ubuntu clang version 3.2-1~exp9ubuntu1 (tags/RELEASE_32/final) (based on LLVM 3.2)

Target: x86_64-pc-linux-gnu

Thread model: posix

 "/usr/bin/ld" -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o bin/world /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../.. -L/lib -L/usr/lib -lpthread -ldl sqlite3/sqlite3.o src/world.o -lc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/crtend.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o

src/world.o: In function `main':

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: undefined reference to `std::cout'

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: …
Run Code Online (Sandbox Code Playgroud)

c++ linker clang undefined-reference libc++

8
推荐指数
1
解决办法
6207
查看次数

使用libc ++输出wchar_t

#include <locale>
#include <iostream>

int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    std::wcout << L"H??£? ?ø???\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这与libstdc ++(gcc和clang)一样正常工作,但只用libc ++打印第一个字符(恰好是ASCII).我在Gentoo Linux上使用libcxx-0.0_p20140322.

这是libc ++中的已知错误,还是我不知道如何烹饪?

更新1.我试过了

std::locale::global(std::locale("en_US.utf8"));
std::locale::global(std::locale(""));
std::setlocale(LC_ALL, "en_US.utf8");
std::setlocale(LC_ALL, "");
Run Code Online (Sandbox Code Playgroud)

这一切都做同样的事情.

更新2.为简单起见,宽字符串文字在这里.当以任何其他方式获得字符串时发生同样的事情(从UTF-8转换,从二进制文件读取,......)

c++ clang++ libc++

8
推荐指数
1
解决办法
175
查看次数

什么是 libc++ 和 libstdc++

我有一些问题。

1) 什么是libc++libstdc++

2)它们之间有什么区别?

3)它们可以互换吗?

4)这是编译器应该实现的东西吗?

5) 我什么时候应该使用一个或另一个?

c++ libstdc++ libc++

8
推荐指数
2
解决办法
2159
查看次数

使用clang ++/libc ++删除Boost libstdc ++依赖项?

这个问题的答案如何使用clang ++/libc ++编译/链接Boost?陈述Boostclang++libc++,以下应该做:

./b2 clean
./b2 toolset=clang cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++"
Run Code Online (Sandbox Code Playgroud)

我在Scientific Linux 6.4 x86_64主机上测试了上述提示,它"主要"用于构建完整的Boost 1_53_0发行版,使用clang++ 3.3svlibc++ 3.3svn.我大多说,因为我真的想删除所有的libstdc++依赖.

不过,以下内容:

  • libboost_graph
  • libboost_locale
  • libboost_regex

仍显示libstdc++依赖关系(ldd输出使其非常明显).我想知道一个很好的方法来删除这样的,并会欣赏任何提示.

c++ boost clang libstdc++ libc++

7
推荐指数
1
解决办法
2245
查看次数

使用libc ++和libstdc ++的void*类型的stringstream行为的差异

以下测试程序返回不同的结果,具体取决于我使用的是libc ++还是libstdc ++.

#include <sstream>
#include <iostream>

int main()
{
    int a = 0;
    void* optr = &a;
    void* iptr;

    std::stringstream ss;
    ss << optr;
    std::cout << ss.str() << '\n';

    ss >> iptr;
    std::cout << iptr << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在OSX 10.9.2上使用Xcode 5的以下版本的clang

$ xcrun clang++ --version              
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)

这是使用libstdc ++和libc ++构建时的测试输出

$ xcrun clang++ test.cpp  <-- libstdc++ version             
$ ./a.out
0x7fff5ec723e8
0x7fff5ec723e8
$ xcrun clang++ test.cpp …
Run Code Online (Sandbox Code Playgroud)

c++ stringstream llvm libc++

7
推荐指数
1
解决办法
492
查看次数

Clang构建错误

我正在尝试在Ubuntu 16.04上构建clang trunk,无论我尝试什么,我都会遇到构建错误.首先,我对gcc 5.4构建了llvm/clang/libc ++/libc ++ abi,​​这很好用.现在我正在尝试使用我刚刚构建的clang来重建llvm/clang/libc ++/libc ++ abi.此操作失败,并显示以下错误消息:

    [162/4396] Linking CXX executable bin/llvm-tblgen FAILED: 
: && /usr/local/bin/clang++ -stdlib=libc++ 
-fPIC
 -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter 
-Wwrite-strings -Wcast-qual -Wmissing-field-initializers 
-pedantic -Wno-long-long -Wcovered-switch-default 
-Wnon-virtual-dtor -Wdelete-non-virtual-dtor 
-Werror=date-time -std=c++11 -fcolor-diagnostics 
-ffunction-sections -fdata-sections -O3 -DNDEBUG  
-lc++ -lc++abi -Wl,-allow-shlib-undefined    
-Wl,-O3 -Wl,--gc-sections 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/AsmMatcherEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/AsmWriterEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/AsmWriterInst.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/Attributes.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CallingConvEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeEmitterGen.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenDAGPatterns.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenInstruction.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenMapTable.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenRegisters.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenSchedule.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenTarget.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcherEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcherGen.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcherOpt.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcher.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DFAPacketizerEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DisassemblerEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/FastISelEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/FixedLenDecoderEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/InstrInfoEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/IntrinsicEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/OptParserEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/PseudoLoweringEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/RegisterInfoEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/SearchableTableEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/SubtargetEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/TableGen.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/X86DisassemblerTables.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/X86ModRMFilters.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/X86RecognizableInstr.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CTagsEmitter.cpp.o  
-o bin/llvm-tblgen …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang libc++

7
推荐指数
1
解决办法
1894
查看次数

如何在 macOS 中使用(链接)调试版本的 libc++?

我想在 macOS 中启用 的调试版本,所以我在[libC++ 的调试版本]libc++中定义,但无法链接. 我猜我的系统中只有release版本,那么如何在macOS中获取debug版本_LIBCPP_DEBUG=1cxx_build_flags libc++libc++libc++

Undefined symbols for architecture x86_64:
"std::__1::__libcpp_db::__decrementable(void const*) const", referenced from:
  void std::__1::__nth_element<std::__1::__debug_less<std::__1::__less<float, float> >&, std::__1::__wrap_iter<float*> >(std::__1::__wrap_iter<float*>, std::__1::__wrap_iter<float*>, std::__1::__wrap_iter<float*>, std::__1::__debug_less<std::__1::__less<float, float> >&)
Run Code Online (Sandbox Code Playgroud)

c++ macos llvm clang libc++

7
推荐指数
1
解决办法
1443
查看次数

由于 MemorySanitizer 警告,使用 MemorySanitizer 工具构建 libc++ 失败

我正在尝试使用 MemorySanitizer 工具构建 libc++,以便我可以使用 MemorySanitizer 构建自己的项目。我在 Ubuntu 16.04 上使用 Clang 8.01。

我按照此处给出的说明进行操作,但构建最初因链接器错误而失败。我通过使用 lld 而不是默认链接器更正了链接器错误。然而,由于 MemorySanitizer 警告,构建失败了:

[  0%] Built target LLVMDemangle
[  4%] Built target LLVMSupport
[  4%] Built target LLVMTableGen
[  5%] Built target obj.llvm-tblgen
[  5%] Built target llvm-tblgen
[  5%] Building AttributesCompatFunc.inc...
==6384==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x51ee14 in _M_lower_bound /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_tree.h:1940:7
    #1 0x51ee14 in find /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_tree.h:2566
    #2 0x51ee14 in find /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_map.h:1194
    #3 0x51ee14 in llvm::RecordKeeper::getClass(llvm::StringRef) const /opt/llvm/llvm-801/include/llvm/TableGen/Record.h:1612
    #4 0xa2ff5c in llvm::TGParser::ParseClass() /opt/llvm/llvm-801/lib/TableGen/TGParser.cpp:2648:28
    #5 0xa2fceb in llvm::TGParser::ParseObject(llvm::MultiClass*) /opt/llvm/llvm-801/lib/TableGen/TGParser.cpp:3010:12 …
Run Code Online (Sandbox Code Playgroud)

llvm llvm-clang libc++ msan

7
推荐指数
1
解决办法
832
查看次数

为什么我缺少 C++20 标头?我该如何解决这个问题?

我已经用谷歌搜索了几个月试图解决这个问题,但我尝试过的都没有效果。

所以一个简单的程序是这样的:

#include <concepts>
#include <iostream>

int main() {
    std::cout << "Test" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

无法编译并显示错误消息fatal error: 'concepts' file not found。clang++ 和 g++ 编译器都会发生这种情况。(为了完整性:clang++-11 -std=c++20 test.cppg++ -std=c++2a test.cpp。)

我的编译器版本是:

> clang++-11 --version
Ubuntu clang version 11.0.0-2~ubuntu20.04.1

> g++ --version
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Run Code Online (Sandbox Code Playgroud)

如果我寻找我的 C++ 头文件,我可以在以下位置找到它们/usr/include/c++

> find /usr -name "iostream"
/usr/lib/llvm-10/include/c++/v1/iostream
/usr/include/c++/9/iostream
Run Code Online (Sandbox Code Playgroud)

然而,find /usr -name "concepts"什么也没给出。所以标题肯定丢失了。连同所有其他特定于 C++20 的标头,以及在其他标头中定义的特定于 C++20 的函数(例如[std::bit_width][1]- 可以包含标头,但未定义函数)。

顺便说一句,我可以使用所有 C++20功能。例如,我可以定义自己的概念,尽管我不能使用概念标题。 …

c++ g++ clang++ libc++ ubuntu-20.04

7
推荐指数
1
解决办法
5657
查看次数