这是我在 XCode 中让 boost/filesystem 进入我的 C++ 程序的最后一次尝试

This is my final attempt at getting boost/filesystem into my C++ program in XCode

我花了大约 8 个小时(不是开玩笑)试图让 filesystem 进入我的 XCode 6.0 项目。我已经用尽了我的谷歌搜索和关于此事的所有 Stack Overflow 线程。

我会尽量给你更多的信息,如果你有什么建议的话,我会尽量给你提供的。

  1. 我已按照 these 说明在 Unix 终端上下载和执行 tar --bzip2 -xf /path/to/boost_1_57_0.tar.bz2。据我所知,一切都很顺利。
  2. 我已将 #include <boost/filesystem.hpp> 添加到程序中的适当位置。我已经适当地设置了我的 Header 搜索路径(虽然现在我不记得我设置这些路径的位置。XCode 太不直观了!)
  3. 按照说明中的第 5 步编译库
  4. 在我的线程中 here, I was told to "link with the boost_system library" and "don't forget -lboost_filesystem". So I went to Build Settings and tried my best to include those. I've tried various combinations, and am still not sure what the heck I'm doing. See the screenshot here
  5. 当我尝试编译我的程序时,我得到的错误是

    ld:找不到 -llibs_system 的库 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

但我知道有些事情是正确的,因为如果我移动所有这些标志,就会出现 3 个错误:

Undefined symbols for architecture x86_64:
  "boost::system::system_category()", referenced from:
      ___cxx_global_var_init2 in main.o
  "boost::system::generic_category()", referenced from:
      ___cxx_global_var_init in main.o
      ___cxx_global_var_init1 in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我的 boost_1_57_0 文件夹的结构是

boost_1_57_0
    boost
        algorithm
        align 
            align.hpp
            aligned_alloc.hpp
            .
            .
        align.hpp
            .
            .
        aligned_storage.hpp
            .
            .
        .
        .
        .
    libs
        accumulator
            doc
            example
            index.html
            test
        algorithm
            .
            .
        align
            .
            .
            .
        .
        .
        .
    .
    .
    .

假设你编译了boost,你可以试试下面的方法:

#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;

int main(int argc, char* argv[])
{
  if (argc < 2)
  {
    std::cout << "Usage: tut1 path\n";
    return 1;
  }
  std::cout << argv[1] << " " << file_size(argv[1]) << '\n';
  return 0;
}

在我的系统上,我用

编译程序
g++ -I ~/boost_1_57_0/ -L ~/boost_1_57_0/stage/lib/ -lboost_system -lboost_filesystem fs.cpp

然后你需要添加~/boost_1_57_0/stage/lib/到你的DYLD_LIBRARY_PATH(否则OSX不知道如何找到动态库,即使你用[=16指定路径=]), 所以从命令行输入

export DYLD_LIBRARY_PATH=~/boost_1_57_0/stage/lib/

(在 XCode 中也有一种方法可以做到这一点,但现在不确定具体方法)。

然后启动程序。

最后的解决方法是通过 macports 安装 boost,它会将所有内容放入 /opt/local,并且不需要将 DYLD_LIBRARY_PATH 导出为 /opt/local/lib 在路径中。或者,使用bootstrap.sh构建boost.

时指定/usr/local/lib为安装目录

我猜当你

"Compiled the library a la step 5 in the instructions"

您没有编译 Boost System 库(否则您会说 "the libraries")。

通常的做法是构建所有库(有时不包括不受支持的项目,但 bootstrap.sh/b2 可能会为您检测到)。

另外,回复。屏幕截图,它是

-lboost_system -lboost_filesystem

不是 -llibs_system

知道了!同样的问题发生在我身上,我通过链接一个额外的库来修复它。导航到 XCode Targets > Build Phases > Link Binary With Libraries 部分并添加 libboost_system.dylib 以及 libboost_filesystem.dylib。我的 XCode 版本是 7.2.1.