我试图让我的程序在libstdc ++版本不同的另一台机器上工作.我正在netbeans上开发和编译它.我已经指定了-static-libstdc ++选项,但程序继续尝试在本地机器上加载libstdc ++.so.6.
如何获得完全静态的libstdc ++链接?
谢谢.
ostream运营商<<采用num_put::put()了数字格式.我正在尝试遵循代码.我将链接到OSX文件,但类似的文件出现在我看到的其他一些系统上.在我看来,num_put::put()呼叫num_put::do_put(),呼叫
num_put::_M_insert_float(),其中calls __convert_from_v():
http://www.opensource.apple.com/source/libstdcxx/libstdcxx-60/include/c++/4.2.1/bits/c++locale.h
http://www.opensource.apple.com/source/libstdcxx/libstdcxx-60/include/c++/4.2.1/bits/locale_facets.tcc
http://www.opensource.apple.com/source/libstdcxx/libstdcxx-60/include/c++/4.2.1/bits/locale_facets.h
Run Code Online (Sandbox Code Playgroud)
__convert_from_v()检查当前的全局语言环境,如果它与"C"不同,则调用setlocale()将全局语言环境设置为"C",然后用于vsnprintf()格式化数字,然后setlocale()再次调用以恢复为旧的语言环境.
由于setlocale()影响所有线程,因此在多线程应用程序中调用具有浮点数的ostream运算符似乎<<是不安全的,该应用程序将全局语言环境设置为"C"以外的其他位置.但那会很奇怪,所以我错过了什么?谢谢!
我希望在一些现有的c ++项目中使用一些c ++ 11特性,所以我开始在一些项目中更改Clang中的编译标志,并且我一直在遇到关于C++ 11处理转换操作符(或者转换)的特定问题运算符)我没想到会看到并且不明白为什么现在这被认为是一个错误,因为它是有效的C++代码而不是c ++ 11
我把它归结为这个简单的例子:
#include <iostream>
#include <vector>
class SerializableFormat
{
public:
size_t i;
};
class A
{
public:
size_t x, y;
A(size_t n) : x(n), y(1) { }
operator const SerializableFormat() const
{
SerializableFormat result;
result.i = x;
if (y)
{
result.i /= y;
}
return result;
}
};
int main(int argc, const char * argv[])
{
std::vector<SerializableFormat> v;
for(size_t i = 0; i < 20; i++)
{
v.push_back(A(i));
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
-std=c++98 …当我使用GCC时,我可以使用以下方法在我的Ubuntu 15.04上构建程序:
-static-libgcc -static-libstdc++
Run Code Online (Sandbox Code Playgroud)
并且编译后的二进制文件可以在"库存"Ubuntu 14.04上运行而无需任何外部软件包,只有标准更新.
是否有可能使用这种静态链接到具有clang的库来构建?
最常见的答案:
ppa:ubuntu-toolchain-r/test)不适合我.
我可以用clang在Ubuntu 14.04.3 LTS上运行吗?
取自 GCC 实现type_traits为什么static_cast需要这里?
template <typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
: public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {};
template <typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
: public integral_constant<bool,
// Why is `static_cast` needed here?
noexcept(static_cast<_Tp>(declval<_Arg>()))> {};
Run Code Online (Sandbox Code Playgroud) 为什么这段代码可以在#if 0块就位的情况下工作,但如果删除它,则会失败并显示一组相当复杂的错误消息?更重要的是,我如何使它与上面非常相似的块得到相同的结果?
#include <ranges>
#include <iterator>
#include <optional>
#include <string_view>
#include <iostream>
#include <algorithm>
template <::std::ranges::view View,
typename Pred>
requires ::std::ranges::input_range<View> &&
::std::ranges::common_range<View> &&
::std::is_object_v<Pred> &&
::std::indirect_unary_predicate<const Pred, ::std::ranges::iterator_t<View>>
class skip_after_view : public ::std::ranges::view_interface<skip_after_view<View, Pred>>
{
public:
skip_after_view() = default;
skip_after_view(View v, Pred p)
: subview_(::std::move(v)), pred_(::std::move(p))
{}
class iterator;
friend class iterator;
auto begin() const {
return iterator{subview_.begin(), subview_.end(), &pred_};
}
auto end() const {
return iterator{subview_.end(), subview_.end(), &pred_};
}
private:
View subview_ = View();
Pred pred_; …Run Code Online (Sandbox Code Playgroud) 我有一个unordered_map<Block, int>块是一个简单的结构定义如下:
struct Block {
size_t start;
size_t end;
bool operator==(const Block& b) const {
return start == b.start && end == b.end;
}
};
namespace std {
template<>
struct hash<Block> {
size_t operator()(const Block& b) const {
return b.start;
}
};
}
Run Code Online (Sandbox Code Playgroud)
当试图访问地图时,我确实在gdb中收到以下错误消息(对于g ++ 4.7.1以及clang ++ 3.1都是如此):
Program received signal SIGFPE, Arithmetic exception.
0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, __num=0, __den=0)
at /usr/include/c++/4.7/bits/hashtable_policy.h:245
245 { return __num % __den; }
Run Code Online (Sandbox Code Playgroud)
我的libstdc ++版本是3.4.17(即GCC 4.7的版本)
相关回溯:
#0 0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, …Run Code Online (Sandbox Code Playgroud) 我试图修复我的问题"GLIBCXX_3.4.15"未找到,这是相当好的文件修复.但它需要从某个地方获取文件"libstdc ++.so.6.0.15".
大多数解决方案告诉我从我编译c ++库的位置获取它.但是,我没有编译它,它来自我的Ubuntu安装,当我为该文件"找到"它没有找到.
所以,我想从某个地方下载它,但我无法在网上找到它.我曾试图将svn看:使用svn://gcc.gnu.org/svn/gcc,但无法找到它(它的巨大的!)
任何帮助非常感谢:)饲料
现在Mac OS X上可以存在多个C++标准库,现在看起来非常混乱.根据/sf/answers/592045961/,混合libstdc ++和libc ++将导致链接错误,这会捕获这样的危险情况并且是一件好事.
另一方面,还有两种情况需要更多调查,我在github gist(https://gist.github.com/manphiz/7195515)中为此创建了一些测试用例.它确认混合链接到libstdc ++(来自系统或vanilla GNU GCC)和libc ++(系统)的动态库将导致链接错误.但是,如果一个动态库链接到系统libstdc ++,而另一个动态库链接到vanilla GNU GCC libstdc ++,然后将它们链接到二进制文件也可以工作,对于我的简单测试用例,它甚至可以在运行时工作.
$ make -f Makefile.system_gnu
g++-4.8 -g -Wall -fPIC -o main.o -c main.cc
g++-4.8 -g -Wall -fPIC -o test_a.o -c test_a.cc
g++-4.8 -dynamiclib -o libtest_a.dylib test_a.o
clang++ -g -Wall -fPIC "-stdlib=libstdc++" -o test_b.o -c test_b.cc
clang++ -dynamiclib "-stdlib=libstdc++" -o libtest_b.dylib test_b.o
g++-4.8 -o test main.o -L. -ltest_a -ltest_b
$ ./test
main_test_a_test_b
Run Code Online (Sandbox Code Playgroud)
所以这里需要建议:
使用稍加修改的版本霍华德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是否要求分配器是默认的可构造的?哪种实施是正确的?