gpt4 book ai didi

C++:所有 boost 路径操作段错误 (OSX/GCC)

转载 作者:可可西里 更新时间:2023-11-01 18:28:09 25 4
gpt4 key购买 nike

我尝试使用 boost 路径执行的几乎所有操作都会出现一致的段错误。

(编辑:似乎所有段错误函数都与 current_path() 相关)

Sample program:

#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <iostream>

using namespace std;
using namespace boost::filesystem;
using namespace boost::system;


int main(int argc, const char * argv[])
{
error_code err;
auto p = path("hello/../world");
cout << p.string() << endl;
path c = canonical(p, err);
cout << c.string() << endl;
}

上面只是一个例子,下面也是segfault:
auto p = current_path(err);

并且:
auto p = initial_path(err);

编译:
g++-4.9 -lboost_filesystem -lboost_system -std=c++11 main.cpp -o ./path-test

输出:

hello/../world
Segmentation fault: 11

GCC 和 Boost 都是通过 Homebrew 安装的。

系统规范:

OSX:   10.9.4
GCC: 4.9.1
Boost: 1.0.55_2

编辑:

使用-g 编译并根据注释安装信号处理程序,输出:

hello/../world
Segfault:
0 path-test 0x000000010ea215b8 _Z7handleri + 28
1 libsystem_platform.dylib 0x00007fff8b9285aa _sigtramp + 26
2 ??? 0x00007fff67bdf1a1 0x0 + 140734933889441
3 path-test 0x000000010ea2196d _ZN5boost10filesystem9canonicalERKNS0_4pathERNS_6system10error_codeE + 69
4 path-test 0x000000010ea21518 main + 138
5 libdyld.dylib 0x00007fff832c35fd start + 1
6 ??? 0x0000000000000001 0x0 + 1

段错误信号处理程序(取自 this question ):

void handler(int sig)
{
void *array[10];
size_t size;

size = backtrace(array, 10);

fprintf(stderr, "Segfault:\n");
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}

最佳答案

您正在混合 C++ 标准库的实现。

Boost,当通过 brew 安装时,将使用 clang++ 进行编译。此工具链默认使用 libc++

g++ 坚持使用它自己的 libstdc++ 实现。

这些实现不是二进制兼容的,这就是问题所在。

我将 boost 的一个新拷贝提取到一个子目录中,做了一个:

$ ./bootstrap.sh --prefix=/usr/local/boost156 cxxflags="-arch i386 -arch x86_64" address-model=32_64 threading=multi macos-version=10.9 toolset=g++-4.8 stage

然后构建它(仅限静态;在 OSX 下,在这种情况下存在构建问题,无法生成动态库 - ld 提示不支持 -h 选项):

$ ./b2 --layout=tagged threading=multi link=static toolset=gcc-4.8

当我编译你的代码时(因为 threading=multi,我不得不在链接选项中添加 -mt):

$ g++-4.8 -g -std=c++11 -Iboost_1_56_0  -Lboost_1_56_0/stage/lib -lboost_filesystem-mt -lboost_system-mt main.cpp -o ./path-test
$ ./path-test
hello/../world

$

即在这种情况下它工作得很好。

这是什么意思?

  • 如果您尝试混合使用 g++clang++,OSX 上的 C++ 库就是一个完整的 PITA
  • 因为所有 clang++ 代码默认是用 libc++ 构建的,如果你打算用 g++
  • 构建它们
  • homebrew 在使用 clang++ 编译时只是遵循命令

这是一团糟,但如果您坚持使用 一个真正的编译器 ,那么您会没事的。 TBH 我更喜欢 clang 的错误消息,而且静态分析非常好;但是,如果您必须使用 g++,则必须保留要使用的任何 c++ 库的私有(private)拷贝,这些库也是使用 g++ 编译的>.

关于C++:所有 boost 路径操作段错误 (OSX/GCC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25664100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com