Я потратил около 8 часов (не шучу), пытаясь получить filesystem
в свой проект XCode 6.0. Я исчерпал свой Googling и все потоки по этому вопросу.
Я постараюсь предоставить вам как можно больше информации, чтобы вы могли предлагать предложения, если они есть.
tar --bzip2 -xf/path/to/boost_1_57_0.tar.bz2
на терминале Unix. Насколько я знаю, все прошло хорошо.#include <boost/filesystem.hpp>
в соответствующее место в моей программе. Я правильно установил пути поиска заголовков (хотя теперь я не могу вспомнить, где именно я их устанавливал. XCode так неинтуитивно!)boost_system
" и "не забывайте -lboost_filesystem
". Поэтому я пошел в "Настройки сборки" и изо всех сил старался включить их. Я пробовал различные комбинации, и я до сих пор не уверен, что я делаю. Смотрите скриншот здесь.Когда я пытаюсь скомпилировать свою программу, я получаю ошибку
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 не знает, как найти динамическую библиотеку, даже если вы указали путь с помощью -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
.
Понял! Эта же проблема возникла со мной, и я исправил ее, связав дополнительную библиотеку. Перейдите в раздел XCode Targets > Build Phases > Link Binary With Libraries и добавьте libboost_system.dylib, а также libboost_filesystem.dylib. Моя версия XCode - 7.2.1.
Я предполагаю, что когда вы
"Составил библиотеку a la step 5 в инструкциях"
вы не скомпилировали библиотеку Boost System (иначе вы бы сказали "библиотеки").
Обычная практика заключается в создании всех библиотек (иногда исключая неподдерживаемые элементы, но bootstrap.sh
/b2
, вероятно, сможет обнаружить это для вас).
Также, Re. скриншот, это
-lboost_system -lboost_filesystem
не -llibs_system