C ++:所有boost路径操作segfault(OSX / GCC) [英] C++: All boost path operations segfault (OSX / GCC)
问题描述
我正与几乎所有的操作,我试图用升压路径执行一致的段错误
(编辑:看来,所有的segfaulting函数与 current_path()
)相关
示例程序:
#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
分段错误:11
通过 Homebrew 安装GCC和Boost。
系统规格:
OSX:10.9.4
GCC:4.9.1
Boost:1.0.55_2
编辑:
编译
-g
并按照注释安装一个信号处理程序,输出:你好/../世界
段错误:
0道测试0x000000010ea215b8 _Z7handleri + 28
1 libsystem_platform.dylib 0x00007fff8b9285aa _sigtramp + 26
2 0x00007fff67bdf1a1为0x0 + 140734933889441
3道测试0x000000010ea2196d _ZN5boost10filesystem9canonicalERKNS0_4pathERNS_6system10error_codeE + 69
4道测试0x000000010ea21518主+ 138
5 libdyld.dylib 0x00007fff832c35fd启动+ 1
6? 0x0000000000000001 0x0 + 1
Segfault信号处理程序(取自):
pre>void handler(int sig)
{
void * array [10];
size_t size;
size = backtrace(array,10);
fprintf(stderr,Segfault:\\\
);
backtrace_symbols_fd(array,size,STDERR_FILENO);
exit(1);
}
通过brew安装时,Boost将使用 clang ++
来编译。
libc ++
。 g ++
使用它自己的的libstdc ++
实施
这些实现不是二进制兼容的,这是问题所在而产生的。
我将boost的新副本提取到子目录中,执行了:
$ ./bootstrap.sh前缀=在/ usr /本地/ boost156 CXXFLAGS = - 拱i386的-arch x86_64的地址模型= 32_64线程=多的MacOS版本= 10.9工具= G ++ - 4.8级
然后内置它(仅限静态;还有的构建问题,即它不能使这个动态库OSX下的情况 - ld抱怨不支持 -h
选项):
$ ./b2 --layout = tagged threading = multi link = static toolset = gcc-4.8
当我编译你的代码(因为threading =多,我不得不添加-mt链接选项):
$ G ++ - 4.8 -g -std = C ++ 11 -Iboost_1_56_0 -Lboost_1_56_0 /台/ lib目录-lboost_filesystem-MT -lboost_system-MT的main.cpp -o ./path-test
$ ./path-test
hello /../ world
$
ie
-
这是什么意思?如果你想混合
g ++
和clang ++
$ b,OSX上的C ++库是一个完整的PITA $ b - ,因为所有的
铛++
代码默认为正与的libc ++
内置你将必须有私人如果您打算使用g ++
- 来构建任何
c ++
homebrew只是在下面的命令,当它编译与clang ++
但如果你坚持使用< sarcasm> 一个真正的编译器< / sarcasm> ;,那么你就没事了。 TBH我喜欢clang的错误消息和静态分析是优秀的;但是如果你必须使用 g ++
,你必须保留任何 c ++
库的私有副本使用,也使用 g ++
编译。
I am getting consistent segfaults with almost any operation I am trying to perform with boost path.
(Edit: It appears that all segfaulting functions are related to 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;
}
The above is just an example, the following also segfault:
auto p = current_path(err);
And:
auto p = initial_path(err);
Compiled with:
g++-4.9 -lboost_filesystem -lboost_system -std=c++11 main.cpp -o ./path-test
Output:
hello/../world
Segmentation fault: 11
Both GCC and Boost installed via Homebrew.
System specs:
OSX: 10.9.4
GCC: 4.9.1
Boost: 1.0.55_2
Edit:
Compiled with -g
and installed a signal handler as per comment, output:
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
Segfault signal handler (Taken from 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);
}
You're mixing implementations of the C++ standard library.
Boost, when installed via brew will be compiled using clang++
. This toolchain uses libc++
by default.
g++
insists on using it's own libstdc++
implementation.
These implementations are not binary compatible, which is where the problems are arising.
I extracted a fresh copy of boost into a subdirectory, did a:
$ ./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
Then built-it (static only; there's a build issue where it can't make the dynamic libraries in this situation under OSX - ld complains that the -h
option is not supported):
$ ./b2 --layout=tagged threading=multi link=static toolset=gcc-4.8
When I compiled your code (because of threading=multi, I had to add -mt to the link options):
$ 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
$
i.e. it worked just fine in this case.
What does this mean?
- C++ libraries on OSX are a complete PITA if you're trying to mix
g++
andclang++
- because all
clang++
code defaults to being built withlibc++
you're going to have to have private copies of anyc++
libraries if you intend to build them withg++
- homebrew is just following orders when it compiles with
clang++
It's a mess, but if you stick to the <sarcasm>one true compiler</sarcasm>, then you'll be fine. TBH I prefer clang's error messages and the static analysis is excellent; but if you have to use g++
, you'll have to keep private copies of any c++
libraries that you want to use, also compiled with g++
.
这篇关于C ++:所有boost路径操作segfault(OSX / GCC)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!