我在GNU/Linux上使用gcc,安装了libc和libstd ++的调试文件和头文件.但我不知道如何告诉gdb使用它们的源代码,特别是调试到libstd ++.libstdc ++本身的源代码似乎是以复杂的结构提供的.我认为目录命令是正确的选择.我在这里使用Debian/Ubuntu并将apt-get source libstdc ++ 6的源代码下载到我的home目录中.
我很确定我不需要为Fedora采取特殊措施(几年前).也许Fedora是以特殊方式准备的.因此,我会对适合每个发行版的一般说明感到高兴.
谢谢
更新
我想通了,我需要编译-D_GLIBCXX_DEBUG除-g,所以编译命令如下$ g++ -o test test.cpp -g -D_GLIBCXX_DEBUG.
此外,我收到了关于丢失漂亮打印机的警告,我按照此处的说明解决了这个问题:http: //gcc.gnu.org/onlinedocs/libstdc++/manual/debug.html#debug.gdb
现在我可以调试到libstdc ++,但我总是收到这条消息:
Breakpoint 1, main () at test.cpp:9
9 string str = "str";
(gdb) s
std::allocator<char>::allocator (this=0x7fffffffe1e0)
at /build/buildd/gcc-4.7-4.7.2/build/x86_64-linux-gnu/libstdc++-v3/include/bits/allocator.h:104
104 /build/buildd/gcc-4.7-4.7.2/build/x86_64-linux-gnu/libstdc++-v3/include/bits/allocator.h: No such file or directory.
(gdb) s
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (
this=0x7fffffffe1c0, __s=0x402930 "str", __a=...)
at /usr/include/c++/4.7/bits/basic_string.tcc:217
217 __s + npos, __a), __a)
Run Code Online (Sandbox Code Playgroud)
我不需要将gdb中的 …
我试图修复我的问题"GLIBCXX_3.4.15"未找到,这是相当好的文件修复.但它需要从某个地方获取文件"libstdc ++.so.6.0.15".
大多数解决方案告诉我从我编译c ++库的位置获取它.但是,我没有编译它,它来自我的Ubuntu安装,当我为该文件"找到"它没有找到.
所以,我想从某个地方下载它,但我无法在网上找到它.我曾试图将svn看:使用svn://gcc.gnu.org/svn/gcc,但无法找到它(它的巨大的!)
任何帮助非常感谢:)饲料
使用稍加修改的版本霍华德Hinnants的C++ 11堆栈分配这是记录在这里,并在这里,与std::basic_string和编译与gcc被使用libstdc++,下面的例子(见直播):
const unsigned int N = 200;
arena<N> a;
short_alloc<char, N> ac(a) ;
std::basic_string<char,std::char_traits<char>,short_alloc<char, N>> empty(ac);
Run Code Online (Sandbox Code Playgroud)
出现以下错误(以及其他错误):
error: no matching function for call to 'short_alloc<char, 200ul>::short_alloc()'
if (__n == 0 && __a == _Alloc())
^
Run Code Online (Sandbox Code Playgroud)
但是在编译clang和使用时它可以正常工作libc++(请参见实时).
该stdlibc++实施std::basic_string预计分配器有一个默认的构造函数.
C++ 11是否要求分配器是默认的可构造的?哪种实施是正确的?
我最近在CentOS上将我的gcc版本从4.7更新到5.4,但是现在我在编译程序时遇到以下错误
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
Run Code Online (Sandbox Code Playgroud)
我找到了一些解决方案,但我仍然无法解决问题.这些是我发现的路径whereis gcc
gcc: /usr/bin/gcc /usr/lib/gcc /usr/local/bin/gcc /usr/local/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz
Run Code Online (Sandbox Code Playgroud)
并将此libstdc包用于CentOS.
我的客户有一些开发人员编写一个小的C++命令行应用到他们的Linux服务器上运行.在服务器(运行Fedora 11),当我执行的应用程序,我碰到下面的错误之一:
error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
显然,我做的第一件事就是
yum install libstdc++
Run Code Online (Sandbox Code Playgroud)
但我明白了
Package libstdc++-4.4.1-2.fc11.x86_64 already installed and latest version
Run Code Online (Sandbox Code Playgroud)
因此,该库已经存在并且是最新的.通常对我来说这些错误表明缺少库.那我下一步该去哪儿?
我想知道是否可以在C++中的unordered_map容器中使用对象引用作为键.
#include <unordered_map>
class Object {
int value;
};
struct object_hash {
inline size_t operator()(const Object& o) const { return 0; }
};
std::unordered_map<Object&, int, object_hash> map;
Run Code Online (Sandbox Code Playgroud)
在尝试编译这个简单的代码片段时,我遇到了一些关于方法重新定义的错误:
使用clang和libc ++
/ usr/include/c ++/v1/unordered_map:352:12:错误:类成员无法重新声明
size_t operator()(const _Cp&__ x)const
使用gcc 4.6和libstdc ++
/usr/include/c++/4.6/bits/hashtable_policy.h:556:5:错误:'std :: __ detail :: _ Map_base <_Key,_Pair,std :: _ Select1st <_Pair>,true,_Hashtable> :: mapped_type&std :: __ detail :: _ Map_base <_Key,_Pair,std :: _ Select1st <_Pair>,true,_Hashtable> :: operator [with _Key = Object&,_ Pair = std :: pair,_Hashtable = std :: …
什么是检查的具体C++中的11个功能中存在的一个好方法标准库.
对于编译器功能,我只是检查(IMHO)主要编译器的编译器版本(目前VC++,gcc,clang,也许是英特尔)虽然这不是最好和最灵活的方法,但我不知道还有更好的东西,除了有非常好的宏的铿锵声__has_feature.
但是对于库特征来说更糟糕的是,这些特征并没有严格地与编译器耦合.目前我想使用相同的方法来检查VC++的编译器版本(假设它使用自己的库,它很容易).对于clang,我至少可以__has_include用于大规模的基于头的查询.除此之外我想__GLIBCXX__如果定义检查的值可能是一个好主意,但是我再次找不到任何特定libstdc ++版本引入哪些功能的信息,除了当前版本支持的功能.
这些方法应该保留给预处理器检查等,因为我想在没有任何复杂的配置过程的情况下在只有头的库中使用它而不使用任何第三方库(是的,boost是第三方).
那么在这些(非常狭窄的)条件下检查特定C++ 11库特征的可能性是什么呢?甚至可能在声明的特定功能或类型的规模上?
如果检查编译器或库版本仍然是最好的方法,我在哪里可以找到有关特定版本的libstdc ++支持的特定C++ 11特性的详细信息(也许还有其他重要的特性,libc ++)?
FWIW目前我对<cstdint>C++ 11的<cmath>功能感兴趣std::hash,但这可能会改变,对于一般方法可能并不重要.
我想在此之后建立Clang:http://clang.llvm.org/get_started.html
在第6步,该命令../llvm/configure运行一系列检查,一个告诉我:
checking whether Clang will select a modern C++ standard library... no
configure: error:
We detected a missing feature in the standard C++ library that was known to be
missing in libstdc++4.6 and implemented in libstdc++4.7. There are numerous
C++11 problems with 4.6's library, and we don't support GCCs or libstdc++ older
than 4.7. You will need to update your system and ensure Clang uses the newer
standard library.
If this error is incorrect …Run Code Online (Sandbox Code Playgroud) 在IOS 64位项目中,我看到了大量的问题,如Apple Mach-O Linker(Id)错误和cryptopp中的未定义符号.问题通常描述为:
Undefined symbols for architecture i386:
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
cv::gpu::error(char const*, char const*, int, char const*) in opencv2(gpumat.o)
Run Code Online (Sandbox Code Playgroud)
问题通常会减少到混合/匹配-stdlib=libc++(LLVM C++运行时)和-stdlib=libstdc++(GNU C++运行时).LLVM的C++运行时(libc++)具有__1装饰符号,但GNU C++运行时libstdc++ 缺少的__1在其名称符号.它会导致符号显示具有相同名称的链接器问题(如std::string).
__1使用LLVM的libc ++时,符号来自何处?
为什么这个问题不是一个解决gnu命名和llvm命名空间?
这是一个相关的问题:libc ++ - 停止std重命名为std :: __ 1?.但它有点忽略了重命名不会发生的重点.
我抓我的头std::optional,而根据该文档,不应该有一个constexpr赋值运算符.
但是,当我在gcc-8.1中尝试这个片段时,它编译并正常工作:
constexpr std::optional<int> foo() {
std::optional<int> bar = 3;
bar = 1337;
return bar;
}
constexpr auto z = foo();
Run Code Online (Sandbox Code Playgroud)
有什么我想念的吗?