使用boost :: filesystem进行分段错误

时间:2013-10-19 19:04:58

标签: c++ xcode macos boost segmentation-fault

我刚刚在我的mac上安装了boost。 (已安装的MacPorts,sudo端口安装提升) 在XCode中,我添加了头部搜索路径(/ opt / local / include)和库搜索路径(/ opt / local / lib),并将库添加到构建阶段 - 链接二进制库(libboost_filesystem-mt.a,libboost_filesystem-mt.dylib) ,libboost_system-mt.a,libboost_system-mt.dylib)。 现在我尝试构建并运行此代码

#include <iostream>
#include <string>
#include <boost/filesystem.hpp>

int main() {
    std::string filename;
    std::cin >> filename;
    std::cout << boost::filesystem::exists(filename);

    return 0;
}

对于任何输入的路径,我在调用exists()时会得到Segmentation Fault:11。

我做错了什么?安装boost时有错误吗?

2 个答案:

答案 0 :(得分:3)

过去我遇到过类似的问题,因为当你的程序没有使用相同的CXXFLAGS构建boost时。这是一组伪完整的引导指令。

# Configure, build, and install boost
./bootstrap.sh \
  --prefix=${PWD}/.local \
  --with-libraries=...,filesystem,...
./b2 \
  -q \
  -d2 \
  -j4 \
  --debug-configuration \
  --disable-filesystem2 \
  --layout=tagged \
  --build-dir=${PWD}/obj \
  cxxflags="-v -std=c++11 -stdlib=libc++" \
  linkflags="-stdlib=libc++" \
  link=shared \
  threading=multi \
  install

重要的部分是cxxflagslinkflags。根据我的经验,这通常是因为macports在不使用-stdlib=libc++的情况下编译,但在使用C++11编译-std=c++11代码时需要这样做。常见的症状包括gdb中的随机回溯,这些回溯表明某个特定结构内部的指针存在于升级库/模板深处的问题。

从上面可以看出,我在每个项目目录(例如${PWD}/.local)中构建了一个boost的本地副本,然后在开发期间链接到本地​​版本,直到打包为止(在点我静态链接或做其他事情。)

# In a GNUmakefile
LOCAL_DIR=${PWD}/.local
INC_DIR=${LOCAL_DIR}/include
LIB_DIR=${LOCAL_DIR}/lib

CPPFLAGS=-I"${INC_DIR}"
CXXFLAGS=-std=c++11 -stdlib=libc++
LDFLAGS=-stdlib=libc++ -L"${LIB_DIR}"

MYPROG_SRCS=myprog.cpp
MYPROG_OBJS=$(MYPROG_SRCS:.cpp=.o)

%.o : %.cpp %.hpp
        ${CXX} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<

myprog: ${MYPROG_OBJS}
        ${CXX} ${LDFLAGS} -o $@ $^ ${LIBS}

结论:您的CPPFLAGSLDFLAGS需要在提升和您的计划之间匹配。

答案 1 :(得分:0)

我刚试了一下它似乎工作正常 - 我按如下方式构建了你的代码:

$ g++ -Wall -lboost_system-mt -lboost_filesystem-mt boost_filesystem.cpp

这是使用Xcode 5,直接从http://boost.org下载并安装在/usr/local中的1.51.0升级版。