3

我刚刚在我的mac上安装了boost。(安装 MacPorts,sudo port install boost)在 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。

我做错了什么?安装boost时是否有任何错误?

4

2 回答 2

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

重要的部分是cxxflagsand linkflags。以我的经验,这通常是因为 macports 编译时不使用-stdlib=libc++,但在使用编译C++11代码时需要使用-std=c++11. 常见的症状包括 gdb 中的随机回溯,这表明某个特定结构内部的指针存在问题,该结构深埋在 boost 库/模板中。

从上面可以看出,我将 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}

底线:您需要在 boost 和您的程序之间进行匹配CPPFLAGSLDFLAGS

于 2013-10-19T19:58:19.967 回答
0

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

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

这是使用 Xcode 5 和 boost 1.51.0 直接从http://boost.org下载并安装在/usr/local.

于 2013-10-19T19:12:18.037 回答