如何在Ubuntu中获得GLIBCXX_3.4.15?我无法运行一些我正在编译的程序.
当我做:
strings /usr/lib/libstdc++.so.6 | grep GLIBC
Run Code Online (Sandbox Code Playgroud)
我明白了:
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我试图在C++ 11代码中使用std :: regex,但看起来支持有点儿错误.一个例子:
#include <regex>
#include <iostream>
int main (int argc, const char * argv[]) {
std::regex r("st|mt|tr");
std::cerr << "st|mt|tr" << " matches st? " << std::regex_match("st", r) << std::endl;
std::cerr << "st|mt|tr" << " matches mt? " << std::regex_match("mt", r) << std::endl;
std::cerr << "st|mt|tr" << " matches tr? " << std::regex_match("tr", r) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
st|mt|tr matches st? 1
st|mt|tr matches mt? 1
st|mt|tr matches tr? 0
Run Code Online (Sandbox Code Playgroud)
当使用gcc(MacPorts gcc47 4.7.1_2)4.7.1编译时,使用
g++ *.cc -o test -std=c++11 …Run Code Online (Sandbox Code Playgroud) libstdc++的 pair 实现有以下奇怪之处
template<typename, typename> class __pair_base
{
template<typename T, typename U> friend struct pair;
__pair_base() = default;
~__pair_base() = default;
__pair_base(const __pair_base&) = default;
__pair_base& operator=(const __pair_base&) = delete;
};
template<typename T, typename U>
struct pair
: private __pair_base<T, U>
{ /* never uses __pair_base */ };
Run Code Online (Sandbox Code Playgroud)
__pair_base从未使用过,也不能使用,因为它是空的。这是特别令人迷惑,因为std::pair是需要是有条件的结构
pair<T, U>如果T和U都是结构类型,则是结构类型。
拥有私人基地使其成为非结构性的。
我需要使用GCC 4.7的libstdc ++将构建在Ubuntu 12.10上的C++应用程序部署到运行Ubuntu 10.04的系统,该系统附带了相当旧版本的libstdc ++.
目前,-static-libstdc++ -static-libgcc正如本博客文章所建议的那样,我正在编译:静态链接libstdc ++.作者在静态编译libstdc ++时警告不要使用任何动态加载的C++代码,这是我尚未检查的内容.到目前为止,一切似乎都很顺利:我可以在Ubuntu 10.04上使用C++ 11功能,这就是我所追求的.
我注意到这篇文章是从2005年开始的,从那以后可能发生了很大变化.它的建议仍然是最新的吗?我应该注意哪些潜在的问题?
我正在使用c/c ++为osx和linux开发命令行界面可执行文件.该项目将链接到opencv.我应该使用libc ++还是libstdc ++?
我在Mac OS X(10.8.2)下使用C++工作,最近我想出了使用C++ 11功能的需求,这些功能可以通过使用libc ++ stdlib的clang ++编译器获得.但是,我还需要使用一些针对libstdc ++编译和链接的遗留库(来自MacPorts).
在这样做时,我得到了链接错误,因为遗留库的标题使用,例如std::string,需要解决std::__1::basic_string(即,libc ++实现std::string)而不是std::basic_string实现.
有没有办法在开发中混合两个库(例如,通过使用一些预处理器标志?)
我将 GCC 编译器从 GIT 存储库更新到版本 11。现在我的测试代码 (GoogleTest/GoogleMock) 抱怨找不到 GLIBCXX_3.4.29。 这不是重复的,请重新打开 发布在: Understanding the gcc version and the GLIBC, GLIBCXX versions in more detail (2 个答案) 中的 答案并没有回答这个问题。
链接器错误是:
/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version GLIBCXX_3.4.29 not found
的输出strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH
Run Code Online (Sandbox Code Playgroud)
在哪里可以找到 3.4.29?
除非我弄错了,否则应该可以通过以下方式创建一个std:array:
std::array<std::string, 2> strings = { "a", "b" };
std::array<std::string, 2> strings({ "a", "b" });
Run Code Online (Sandbox Code Playgroud)
然而,使用GCC 4.6.1我无法使其中任何一个工作.编译器简单地说:
expected primary-expression before ',' token
Run Code Online (Sandbox Code Playgroud)
然而初始化列表与std :: vector一起工作正常.那是哪个呢?我错误地认为std :: array应该接受初始化列表,还是让GNU标准C++库团队搞错了?
什么时候需要使用-stdlib=libstdc++gcc编译时使用编译器和链接器的标志?
编译器是否自动使用libstdc ++?
我在Ubuntu 13.10上使用gcc4.8.2,我想使用c ++ 11标准.我已经传递-std=c++11给了编译器.
考虑以下片段:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Run Code Online (Sandbox Code Playgroud)
显然它会在大多数平台上崩溃,因为默认堆栈大小通常小于 20MB。
现在考虑以下代码:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是它也崩溃了!回溯(使用最近的 libstdc++ 版本之一)指向include/bits/stl_uninitialized.h文件,我们可以在其中看到以下几行:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
Run Code Online (Sandbox Code Playgroud)
调整大小vector构造函数必须默认初始化元素,这就是它的实现方式。显然,_ValueType()临时会导致堆栈崩溃。
问题是它是否是一个符合要求的实现。如果是,那实际上意味着大类型向量的使用非常有限,不是吗?