Файл ext/slist не найден в OS X 10.9

Я пытаюсь получить старое стороннее программное обеспечение для компиляции на OS X 10.9. Мне удалось избавиться от большинства проблем с компиляцией, изменив настройки в файлах Makefile, которые изначально были написаны для gcc, вероятно, примерно в 2005 году. Однако в настоящее время я не знаю, как преодолеть эту ошибку для Исходный файл С++:

/utility.h:42:10: фатальная ошибка: файл «ext/slist» не найден

Я понимаю, что ext/slist принадлежит какой-то версии STL. Была ли эта версия заменена или ее нужно активировать каким-либо особым образом для версии Apple Clang/LLVM (5.0 для ОС Х 10.9)?

Если это вообще возможно, я бы предпочел скомпилировать это программное обеспечение с предустановленными инструментами и не выполнять такие шаги, как установка gcc через MacPorts.

Кстати, эти предупреждения также сохраняются:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/ext/hash_set:202:2: предупреждение: использование заголовка устарело. Перейдите в [-W#warnings] /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/ext/hash_map:209:2: предупреждение: использование заголовок устарел. Перейти на [-W#warnings]


person Drux    schedule 03.11.2013    source источник


Ответы (1)


Slist представляет собой односвязный список и является расширением, включенным в libstdc++. Mac OS X переходит от libstdc++ к libc++, которая предоставляет стандартную библиотеку C++11. C++11 предоставляет односвязный список под именем std::forward_list в заголовке <forward_list>.

Я считаю, что libstdc++ по-прежнему включен в инструменты разработчика, поэтому вы также можете вернуться к нему в своем проекте. Если вы используете проект Xcode, вы можете выбрать библиотеку в настройках сборки или убедиться, что программа собирается с -stdlib=libstdc++

person bames53    schedule 03.11.2013
comment
Спасибо, -stdlib=libstdc++ решил проблему. Теперь я получаю другие ошибки, такие как эта: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1/memory:222:7: note: candidate function not viable: no known conversion from 'tree *'(aka 'tree_node<> *') to 'std::auto_ptr<tree_node<tree_label> ...". Может быть, мне нужно настроить путь включения, чтобы отразить и старую библиотеку? - person Drux; 04.11.2013
comment
Нет, эта ошибка относится к старой библиотеке. Эта ошибка, по-видимому, является результатом различий между новым компилятором и старым. - person bames53; 04.11.2013
comment
Так что это выглядит так, как будто более новый, более строгий компилятор больше не принимает заголовочные файлы из старой библиотеки и без установки (MacPorts | brew) & gcc я застрял... - person Drux; 04.11.2013
comment
Clang по-прежнему часто используется с libstdc++, так что проблема не в том, что он не работает с заголовками, а в том, что ваша программа использует библиотеку неподдерживаемым образом. Вам придется либо изменить код самой программы, либо использовать более старую цепочку инструментов. Если у вас есть старая версия OS X и Xcode, вы можете попробовать. В Xcode 4 все еще есть llvm-gcc, который, вероятно, успешно скомпилирует программу как есть. - person bames53; 04.11.2013
comment
@ bemes53 bemes53 Да, я планирую использовать более старую версию OS X с Xcode (или gcc), как вы говорите. Просто из любопытства: почему это проблема программы, когда сообщения об ошибках указывают на стандартные файлы заголовков (они не принадлежат программе)? - person Drux; 05.11.2013
comment
Стандартная библиотека предоставляет компоненты, которые работают правильно только при правильном использовании. Библиотека написана с расчетом на то, что она будет использоваться правильно, и не тестировалась и не проверялась на работоспособность при других обстоятельствах. Условия правильного использования часто слишком сложны для понимания и проверки компилятором. Поэтому, когда компонент используется неправильно, компилятор не может понять и указать, где программа ошиблась, он просто видит глубоко внутри механизма стандартной библиотеки, что что-то пошло не так. - person bames53; 05.11.2013
comment
Звучит как юрист, говорящий от имени компилятора, но вы, вероятно, правы :) В любом случае, попробовать более старую версию кажется правильным путем. - person Drux; 05.11.2013