当与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) 我在我的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) #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转换,从二进制文件读取,......)
我有一些问题。
1) 什么是libc++和libstdc++?
2)它们之间有什么区别?
3)它们可以互换吗?
4)这是编译器应该实现的东西吗?
5) 我什么时候应该使用一个或另一个?
这个问题的答案如何使用clang ++/libc ++编译/链接Boost?陈述Boost与clang++和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.3sv和libc++ 3.3svn.我大多说,因为我真的想删除所有的libstdc++依赖.
不过,以下内容:
libboost_graphlibboost_localelibboost_regex仍显示libstdc++依赖关系(ldd输出使其非常明显).我想知道一个很好的方法来删除这样的,并会欣赏任何提示.
以下测试程序返回不同的结果,具体取决于我使用的是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) 我正在尝试在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) 我想在 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) 我正在尝试使用 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) 我已经用谷歌搜索了几个月试图解决这个问题,但我尝试过的都没有效果。
所以一个简单的程序是这样的:
#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.cpp和g++ -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功能。例如,我可以定义自己的概念,尽管我不能使用概念标题。 …