Это моя последняя попытка добавить boost / filesystem в мою программу на C ++ в XCode

0

Я потратил около 8 часов (не шучу), пытаясь получить filesystem в свой проект XCode 6.0. Я исчерпал свой Googling и все потоки по этому вопросу.

Я постараюсь предоставить вам как можно больше информации, чтобы вы могли предлагать предложения, если они есть.

  1. Я выполнил эти инструкции для загрузки и выполнения tar --bzip2 -xf/path/to/boost_1_57_0.tar.bz2 на терминале Unix. Насколько я знаю, все прошло хорошо.
  2. Я добавил #include <boost/filesystem.hpp> в соответствующее место в моей программе. Я правильно установил пути поиска заголовков (хотя теперь я не могу вспомнить, где именно я их устанавливал. XCode так неинтуитивно!)
  3. Скомпилировал библиотеку a la step 5 в инструкциях
  4. В моей теме здесь мне сказали "связаться с библиотекой boost_system " и "не забывайте -lboost_filesystem ". Поэтому я пошел в "Настройки сборки" и изо всех сил старался включить их. Я пробовал различные комбинации, и я до сих пор не уверен, что я делаю. Смотрите скриншот здесь.
  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
            .
            .
            .
        .
        .
        .
    .
    .
    .
  • 0
    Вы сами компилировали Boost или просто распаковали его? Вам нужно скомпилировать библиотеку, см. Сек. 5 из инструкций вы разместили.
  • 0
    Да, я это скомпилировал. Позвольте мне отредактировать мой основной пост.
Показать ещё 4 комментария
Теги:
linker
xcode
boost

3 ответа

0
Лучший ответ

Предполагая, что вы скомпилировали 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 не знает, как найти динамическую библиотеку, даже если вы указали путь с помощью -L), поэтому введите из командной строки

export DYLD_LIBRARY_PATH=~/boost_1_57_0/stage/lib/

(есть способ сделать это и в XCode, но точно не знаю, как сейчас).

Затем просто запустите программу.

Последнее решение - установить boost через macports, он поместит все в /opt/local и не потребует экспорта DYLD_LIBRARY_PATH, поскольку /opt/local/lib находится в пути. Или укажите /usr/local/lib в качестве установочного каталога при использовании bootstrap.sh для создания boost.

1

Понял! Эта же проблема возникла со мной, и я исправил ее, связав дополнительную библиотеку. Перейдите в раздел XCode Targets > Build Phases > Link Binary With Libraries и добавьте libboost_system.dylib, а также libboost_filesystem.dylib. Моя версия XCode - 7.2.1.

0

Я предполагаю, что когда вы

"Составил библиотеку a la step 5 в инструкциях"

вы не скомпилировали библиотеку Boost System (иначе вы бы сказали "библиотеки").

Обычная практика заключается в создании всех библиотек (иногда исключая неподдерживаемые элементы, но bootstrap.sh/b2, вероятно, сможет обнаружить это для вас).

Также, Re. скриншот, это

-lboost_system -lboost_filesystem

не -llibs_system

Ещё вопросы

Сообщество Overcoder
Наверх
Меню