C++ C++;:所有升压路径操作SEGFULT(OSX/GCC)

C++ C++;:所有升压路径操作SEGFULT(OSX/GCC),c++,macos,gcc,boost,boost-filesystem,C++,Macos,Gcc,Boost,Boost Filesystem,我尝试使用boost path执行的几乎所有操作都会出现一致的故障 (编辑:似乎所有segfaulting函数都与当前路径()相关。) GCC和Boost都是通过自制软件安装的 系统规格: OSX: 10.9.4 GCC: 4.9.1 Boost: 1.0.55_2 编辑: 使用-g编译,并根据注释安装信号处理程序,输出: hello/../world Segfault: 0 path-test 0x000000010ea215

我尝试使用boost path执行的几乎所有操作都会出现一致的故障

编辑:似乎所有segfaulting函数都与
当前路径()相关。

GCC和Boost都是通过自制软件安装的

系统规格:

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
SEGFULT信号处理器(取自):


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

通过brew安装时,Boost将使用
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
选项):

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

i、 在这种情况下效果很好

这是什么意思

  • 如果您试图混合使用
    g++
    clang++
  • 因为所有的
    clang++
    代码默认都是使用
    libc++
    构建的,所以如果您打算使用
    g++
    构建任何
    c++
    库,就必须拥有它们的私有副本
  • 使用
    clang++

这是一个混乱,但如果你坚持一个真正的编译器,那么你会没事的。TBH我更喜欢clang的错误消息,静态分析非常好;但是如果你必须使用
g++
,你必须保留你想要使用的任何
c++
库的私有副本,除了Petesh极好的答案之外,还要使用
g++

编译这些库,对于那些正在通过自制使用gcc构建boost的人:

brew install boost --build-from-source --env=superenv --cc=gcc-<Your GCC version>
生成以下输出:

/usr/local/lib/libboost_system.dylib:
    /usr/local/lib/libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/local/lib/gcc/x86_64-apple-darwin13.3.0/4.9.1/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.20.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /usr/local/Cellar/gcc/4.9.1/lib/gcc/x86_64-apple-darwin13.3.0/4.9.1/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
第二项显示这个boost库链接到GCC的
libstd++
。如果它说的是
/usr/lib/libc++.dylib
,那么它仍然与苹果的clang运行时相关联


请注意,使用brew可以启用所有变体(单个/多个/静态/动态),因为公式的维护人员使用了补丁程序,以确保它在OSX上成功编译-这可能不是vanilla boost的基础。

您能向我们展示完整的堆栈跟踪吗?首先使用
-g
构建!该死的,我有一种感觉,这是沿着这些路线的东西,但无法理解!我从来都不知道clang和gcc是二进制不兼容的(就此而言,我也没有问过自己用什么来制作boost via brew)。我将尝试通过brew构建boost的gcc版本。当您使用默认的
-stdlib=libc++
时,
clang++
g++
不兼容二进制文件。基本C编译器是绝对二进制兼容的。我建议您坚持使用boost的私有副本,您知道它是用
g++
编译的;因为如果您对brew进行了升级,并且没有重新调整配方,那么您最终将处于与以前相同的位置
$ ./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
$ ./b2 --layout=tagged threading=multi link=static toolset=gcc-4.8
$ 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

$
brew install boost --build-from-source --env=superenv --cc=gcc-<Your GCC version>
otool -L /usr/local/lib/libboost_system.dylib
/usr/local/lib/libboost_system.dylib:
    /usr/local/lib/libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/local/lib/gcc/x86_64-apple-darwin13.3.0/4.9.1/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.20.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /usr/local/Cellar/gcc/4.9.1/lib/gcc/x86_64-apple-darwin13.3.0/4.9.1/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)