使用提升::文件系统的分段错误

Segmentation fault with boost::filesystem

本文关键字:分段 错误 文件系统      更新时间:2023-10-16

我刚刚在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;
}

对于键入的任何路径,我都得到了分段错误:11 当调用 exists() 时。

我做错了什么?安装助推器时有什么错误吗?

我过去遇到过类似的问题,当 boost 不是用与您的程序相同的CXXFLAGS构建时。这是一组伪完整的引导指令。

# 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++的情况下进行编译,但是在使用-std=c++11编译C++11代码时,这是必需的。常见症状包括 gdb 中的随机回溯,这些回溯表明隐藏在提升库/模板深处的特定结构内的指针存在问题。

从上面可以看出,我在每个项目的目录中构建了一个 boost 的本地副本(例如 ${PWD}/.local ),然后在开发过程中链接到本地版本,直到需要打包(此时我静态链接或执行其他操作)。

# 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需要在 boost 和您的计划之间匹配。

我刚刚尝试过,它似乎工作正常 - 我按如下方式构建了您的代码:

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

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