我有一台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) 当与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) 我有一个胖(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?
随着我最近升级到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++ 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) 我的基本想法是从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) 我试图在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)
有没有其他方法来解决它?谢谢!
根据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) 我遇到一个非常奇怪的行为,我将其提炼为一个非常基本的测试:
#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) 升级到 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)