标签: libstdc++

如何静态链接libstdc ++

我试图让我的程序在libstdc ++版本不同的另一台机器上工作.我正在netbeans上开发和编译它.我已经指定了-static-libstdc ++选项,但程序继续尝试在本地机器上加载libstdc ++.so.6.

如何获得完全静态的libstdc ++链接?

谢谢.

c++ g++ libstdc++ static-linking

11
推荐指数
1
解决办法
1万
查看次数

是libstdc ++线程中的ostream操作符<< hostile?

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++ locale thread-safety libstdc++

11
推荐指数
1
解决办法
357
查看次数

C++ 11与C++ 98转换运算符的行为有何变化?

我希望在一些现有的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)
  • 如果Clang的编译标志设置为-std=c++98 …

c++ llvm libstdc++ c++11 libc++

11
推荐指数
1
解决办法
1437
查看次数

使用clang的静态链接libstdc ++

当我使用GCC时,我可以使用以下方法在我的Ubuntu 15.04上构建程序:

-static-libgcc -static-libstdc++
Run Code Online (Sandbox Code Playgroud)

并且编译后的二进制文件可以在"库存"Ubuntu 14.04上运行而无需任何外部软件包,只有标准更新.

是否有可能使用这种静态链接到具有clang的库来构建?

最常见的答案:

  • 使用测试ubuntu rep(ppa:ubuntu-toolchain-r/test)
  • 更新服务器
  • 在目标服务器上重新编译
  • 不要使用GCC

不适合我.

我可以用clang在Ubuntu 14.04.3 LTS上运行吗?

c++ ubuntu clang libstdc++ static-linking

11
推荐指数
1
解决办法
8684
查看次数

为什么在 gcc 的 is_nothrow_constructible 实现中需要 static_cast?

取自 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)

c++ libstdc++ static-cast type-traits

11
推荐指数
1
解决办法
237
查看次数

您如何使用运算符 | 创建与现有视图交互的自己的视图?

为什么这段代码可以在#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)

c++ g++ libstdc++ c++20 std-ranges

11
推荐指数
1
解决办法
275
查看次数

访问unordered_map时的SIGFPE

我有一个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)

c++ gcc clang libstdc++

10
推荐指数
2
解决办法
3583
查看次数

我在哪里可以获得libstdc ++.so.6.0.15文件的副本

我试图修复我的问题"GLIBCXX_3.4.15"未找到,这是相当好的文件修复.但它需要从某个地方获取文件"libstdc ++.so.6.0.15".

大多数解决方案告诉我从我编译c ++库的位置获取它.但是,我没有编译它,它来自我的Ubuntu安装,当我为该文件"找到"它没有找到.

所以,我想从某个地方下载它,但我无法在网上找到它.我曾试图将svn看:使用svn://gcc.gnu.org/svn/gcc,但无法找到它(它的巨大的!)

任何帮助非常感谢:)饲料

c++ file find libstdc++

10
推荐指数
1
解决办法
5万
查看次数

在Mac OS X上链接不同的C++标准库

现在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)

所以这里需要建议:

  • 我们可以混合系统libstdc ++和手动构建的GNU GCC libstdc ++吗?如果没有,什么时候会引起麻烦?
  • 我们可以混合使用系统libc ++和手动构建的Clang libc ++吗?如果没有,什么时候会引起麻烦? …

c++ macos std libstdc++ libc++

10
推荐指数
1
解决办法
7397
查看次数

C++ 11是否要求分配器是默认可构造的,libstdc ++和libc ++是否不一致?

使用稍加修改的版本霍华德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是否要求分配器是默认的可构造的?哪种实施是正确的?

c++ libstdc++ allocator language-lawyer c++11

10
推荐指数
1
解决办法
555
查看次数