标签: libstdc++

OS X程序在开发机器上运行,在其他程序上崩溃

我有一台OS X 10.6 Mac我用作我的开发机器.我编写的程序在开发机器上完美运行.但是,当我尝试在OS X 10.5上运行它(不确定是否相关)测试机器时,它会在启动时崩溃.

这是我得到的错误:

Process:         MyApp[25908]
Path:            /Applications/MyApp.app/Contents/MacOS/MyApp
Identifier:      MyApp
Version:         ??? (???)
Code Type:       X86 (Native)
Parent Process:  launchd [109]

Interval Since Last Report:          17392106 sec
Crashes Since Last Report:           735
Per-App Interval Since Last Report:  0 sec
Per-App Crashes Since Last Report:   8

Date/Time:       2010-08-14 07:50:09.768 -0700
OS Version:      Mac OS X 10.5.8 (9L31a)
Report Version:  6
Anonymous UUID:  1BF30470-ACF2-46C7-B6D5-4514380965C8

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread:  0

Dyld Error Message:
  Symbol …
Run Code Online (Sandbox Code Playgroud)

macos libstdc++

8
推荐指数
1
解决办法
1184
查看次数

libc ++和libstdc ++之间的istream eof差异

当与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)

c++ istream libstdc++ libc++

8
推荐指数
2
解决办法
1195
查看次数

当nm找不到符号时,处理"dyld:惰性符号绑定失败:未找到符号"错误

我有一个胖(32位和64位)英特尔二进制文件myBinary,无法在运行Mac OS X 10.8.2的另一个工作站上运行:

$ myBinary
dyld: lazy symbol binding failed: Symbol not found: __ZNSt8__detail15_List_node_base7_M_hookEPS0_
  Referenced from: /usr/local/bin/myBinary
  Expected in: /usr/lib/libstdc++.6.dylib

dyld: Symbol not found: __ZNSt8__detail15_List_node_base7_M_hookEPS0_
  Referenced from: /usr/local/bin/myBinary
  Expected in: /usr/lib/libstdc++.6.dylib

Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)

我是从运行GCC 4.7.2的Mac OS X 10.8.2工作站编译的:

$ gcc --version
gcc (MacPorts gcc47 4.7.2_2+universal) 4.7.2
Run Code Online (Sandbox Code Playgroud)

我跑nm了,符号未定义:

$ nm /usr/local/bin/myBinary | grep __ZNSt8__detail15_List_node_base7_M_hookEPS0_
     U __ZNSt8__detail15_List_node_base7_M_hookEPS0_
Run Code Online (Sandbox Code Playgroud)

编译时我错过了什么或做错了什么myBinary?我不知道我能做些什么来丢失符号/usr/lib/libstdc++.6.dylib- 我应该将C++库静态编译成myBinary

macos gcc dylib libstdc++ osx-mountain-lion

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

libc ++和libstdc ++之间istream的运算符>>(double和val)之间的差异

随着我最近升级到Mac OS X 10.9,默认的标准C++库从libstdc ++更改为libc ++.从那时起,我观察到下面的代码示例中记录的字符串流运算符>>(double)的意外行为.

总之,当double值后跟一个字母时,libc ++似乎在从stringstreams中提取double值时遇到问题.

我已经检查过标准(2003)但是如果在这种情况下提取应该起作用,我找不到任何具体的信息.

所以,如果这是一个libc ++或libstdc ++中的错误,我将不胜感激.

#include <sstream>
#include <iostream>

using namespace std;

void extract_double(const string & s)
{
  stringstream ss;
  double d;

  ss << s;
  ss >> d;
  if(!ss.fail())
    cout << "'" << ss.str() << "' converted to " << d << endl;
  else
    cout << "'" << ss.str() << "' failed to convert to double" << endl;
}

int main()
{
  extract_double("-4.9");
  extract_double("-4.9 X");
  extract_double("-4.9_");
  extract_double("-4.9d");
  extract_double("-4.9X");
}
Run Code Online (Sandbox Code Playgroud)

c++ --stdlib=libc++ streamtest.cxx …

c++ stringstream istream libstdc++ libc++

8
推荐指数
1
解决办法
455
查看次数

强制或阻止使用特定的次要版本的libstdc ++

为了使用C++ 11和c ++ 14的功能,我有一个使用较新版本的gcc(4.9.1)编译的应用程序,因此是一个较新版本的libstdc ++.该应用程序由许多小程序组成,因此我将libstdc ++作为共享库而不是静态库链接(即我不希望使用-static-libstdc ++)

我希望使用/ opt // lib64下的应用程序发布新版本的libstdc ++(注意:这是在GPL例外情况下特别允许的)

新版本的libstdc ++.so与目标平台上的版本只有次要版本不同.libstdc ++旨在向前兼容,以便现有程序可以使用新版本的库.但是,当一些程序使用新版本而不是旧版本时,我观察到行为(即错误)的细微差别.我希望防止这种情况发生.

我还发现,ld将尝试我的应用程序使用的libstdc系统版本链接++,除非我把的/ opt // lib64的较早的LD_LIBRARY_PATH.据说你可以使用强制链接特定版本-l:<library>.<version>,但是,这似乎不起作用.我怀疑它会用于用户创建的库,但不会用于像libstd ++这样的语言运行库,因为gcc本身会生成链接器脚本.同样在我的一个目标平台(RHEL5)上,gcc/ld甚至都不理解它.我认为这可以通过使用-nostdlib并在我的构建系统中链接所需的所有内容(例如-lgcc),而不是将它留给我更喜欢的gcc.到目前为止我还没试过这个.

解决此问题的一种简单方法是确保LD_LIBRARY_PATH在运行我的应用程序时包含/ opt // lib64,否则或者我可以将LD_PRELOAD与正确的库版本一起使用.如果有人决定忽略我的建议和运行,这个问题

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/<vendor>/lib64 
Run Code Online (Sandbox Code Playgroud)

它可能会导致细微而难以诊断的问题.所以我一直在寻找更好的方法.

我想知道是否有某种方法我可以将libstdc ++重命名为lib_stdc ++并链接到该soname.重命名libstdc ++是不够的,因为您需要更改readelf给出的文件中的soname.即

0x000000000000000e (SONAME)             Library soname: [libstdc++.so.6]
Run Code Online (Sandbox Code Playgroud)

如果你在一个正常的程序上执行此操作,gcc即使使用-l:stdc++.so.6.0.20说,你会发现这给出了主要版本,而不是特定的次要版本.即

readelf -d <myapp>
0x0000000e (SONAME)                     Library soname: [libstdc++.so.6]
Run Code Online (Sandbox Code Playgroud)

而不是:

0x0000000e (SONAME)                     Library soname: [libstdc++.so.6.0.20]
Run Code Online (Sandbox Code Playgroud)

所以我改为使用我想要依赖的soname创建一个虚拟共享库,以便添加依赖项,如下所示:

gcc dummy.o -Wl,-soname,lib<vendor>_stdc++.so.6.0.20 -nostdlib -shared -o lib<vender>_dummycpp.so
Run Code Online (Sandbox Code Playgroud)

(其中dummy.o是一个空的目标文件,由空的源文件制成,用于停止-nostdlib导致投诉)

然后:

gcc <myapp> -l<vendor>_dummycpp
Run Code Online (Sandbox Code Playgroud)

根据需要,我现在得到:

readelf -d <myapp>

0x0000000000000001 (NEEDED)             Shared library: …
Run Code Online (Sandbox Code Playgroud)

c++ linux gcc libstdc++ c++11

8
推荐指数
1
解决办法
1546
查看次数

从std :: tuple派生时的混乱,无法处理std :: get

我的基本想法是从std :: tuple派生我自己的类,以获得一些内部帮助器类型:

template <typename ... T>
class TypeContainer: public std::tuple<T...>
{   
    public:
        using BaseType = std::tuple<T...>;
        static const size_t Size = sizeof...(T);
        TypeContainer(T... args):std::tuple<T...>(args...){};

        using index_sequence = std::index_sequence_for<T...>;
};
Run Code Online (Sandbox Code Playgroud)

现在我尝试使用如下代码:

using MyType_tuple_with_empty =         std::tuple<       std::tuple<float,int>,    std::tuple<>,    std::tuple<int>>;
using MyType_typecontainer_with_empty = TypeContainer< TypeContainer<float,int>, TypeContainer<>, TypeContainer<int>>;

using MyType_tuple_non_empty =          std::tuple<       std::tuple<float,int>,    std::tuple<int>,    std::tuple<int>>;
using MyType_typecontainer_non_empty =  TypeContainer< TypeContainer<float,int>, TypeContainer<int>, TypeContainer<int>>;

template <typename T>
void Do( const T& parms )
{
    // The following lines result in errors if TypeContainer with
    // …
Run Code Online (Sandbox Code Playgroud)

c++ tuples libstdc++ c++11 stdtuple

8
推荐指数
1
解决办法
1729
查看次数

libstdc ++.so.6:版本`GLIBCXX_3.4.21'找不到错误

我试图在debian 8(Jessie)上运行swift 3.0.但是,我认为我的笔记本电脑上没有所需的libstdc ++.so.6文件版本.我在终端输入"locate libstdc ++.so.6".以下是我在终端回复的回复.

/usr/lib/i386-linux-gnu/libstdc++.so.6
/usr/lib/i386-linux-gnu/libstdc++.so.6.0.20
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
/usr/share/gdb/auto-load/usr/lib/i386-linux-gnu/libstdc++.so.6.0.20-gdb.py
/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20-gdb.py
Run Code Online (Sandbox Code Playgroud)

我还在终端输入"whereis GLIBCXX_3.4.21",然后得到

GLIBCXX_3.4:
Run Code Online (Sandbox Code Playgroud)

我也试过了

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
Run Code Online (Sandbox Code Playgroud)

除此之外,我也试过了

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_DEBUG_MESSAGE_LENGTH
Run Code Online (Sandbox Code Playgroud)

有没有其他方法来解决它?谢谢!

linux debian libstdc++ swift

8
推荐指数
1
解决办法
7257
查看次数

std :: vector :: emplace()是否真的在抛出移动构造函数/赋值运算符时提供强大的异常保证?

根据cppreference.com,std :: vector :: emplace()无条件地提供强大的异常保证:

如果抛出异常(例如,通过构造函数),则容器保持不变,就好像从未调用此函数一样(强异常保证).

但是,GCC 7.1.1在实践中似乎并非如此.以下程序:

#include <iostream>
#include <vector>

struct ugly
{
  int i;

  ugly(int i) : i{i} { }

  ugly(const ugly& other) = default;

  ugly& operator=(ugly&& other) {
    if (other.i == 3) {
      throw other.i;
    }
    i = other.i;
    return *this;
  }

  ugly& operator=(const ugly& other) = default;
};

int main() {
  std::vector<ugly> vec;
  vec.reserve(6);
  vec.emplace_back(0);
  vec.emplace_back(1);
  vec.emplace_back(2);
  vec.emplace_back(4);
  vec.emplace_back(5);

  try {
    vec.emplace(vec.begin() + 3, 3);
  } catch (int i) {
  }

  for (const auto& …
Run Code Online (Sandbox Code Playgroud)

c++ vector libstdc++ c++11

8
推荐指数
1
解决办法
546
查看次数

在std :: filesystem :: path追加上的c ++ std :: bad_alloc

我遇到一个非常奇怪的行为,我将其提炼为一个非常基本的测试:

#include <string>
#include <filesystem>

int main(void)
{
  const std::string name = "foo";
  const std::filesystem::path lock_dir = "/tmp";
  std::filesystem::path lockfile = lock_dir / name;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我用编译g++ -std=c++17 -Wall -Wextra -Werror -g foo.cpp -o foo。当我运行它时,在添加两个路径的那一行上,我得到了一个std :: bad_alloc异常。这是我在gdb中看到的

#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff742c801 in __GI_abort () at abort.c:79
#2  0x00007ffff7a8e1f2 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff7a99e36 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff7a99e81 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff7a9a0b5 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 …
Run Code Online (Sandbox Code Playgroud)

c++ gdb exception libstdc++ c++17

8
推荐指数
1
解决办法
336
查看次数

std::from_chars 是否应该处理大写十六进制指数?

升级到 Ubuntu 22.04 (amd64) 时,我注意到以下代码开始给出结果 1.4375,而不是预期值 1472:

#include <charconv>
#include <iostream>
#include <string_view>

int main()
{
    std::string_view src{"1.7P10"};
    double value;
    auto result = std::from_chars(src.data(), src.data() + src.size(), value, std::chars_format::hex);
    std::cout << value << '\n';
}
Run Code Online (Sandbox Code Playgroud)

P如果我将源中的字符更改为小写,我会得到预期的结果p。大写和小写都适用于std::strtod.

应该std::from_chars会因大写指数字符而失败,或者这是 g++/libstdc++ 中的错误?

用于编译的命令行:

g++ -std=c++17 test.cpp
Run Code Online (Sandbox Code Playgroud)

(优化级别似乎没有效果)

输出g++ --version

g++ (Ubuntu 11.2.0-19ubuntu1) 11.2.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point libstdc++ c++17

8
推荐指数
1
解决办法
590
查看次数