Я использую VS 2017 Community Edition, Intel Compiler 17.00 обновление 6 и Boost 1.66, пытаясь узнать мой путь в boost :: multiprecision :: float128. Буквально взяв пример кода из Вот и положить его в новый проект для VS.
Компиляция дает несколько ошибок, примерно в двух категориях / файлах:
В float128.hpp:
три ошибки «error: идентификатор« xxx »не определен» для fmaq, remquoq и remainderq. На самом деле я не могу найти определения для них — пропущенное включение?
глобальная область действия не имеет «signbitq» — это снова выглядит как отсутствующее определение (то есть то же, что и выше)
Для GCC вышеупомянутые функции находятся в quadmath.h, однако, заголовок boost не включает его при использовании ICC (т.е. установлен BOOST_MP_USE_QUAD).
Я предполагаю, что мне нужно удалить что-то, что было вставлено по умолчанию из VS, но я в недоумении, что именно.
Спасибо за помощь
РЕДАКТИРОВАТЬ: Ошибки № 2 выше на самом деле не против повышения (я должен перенести это на отдельный вопрос?).
Следующий код скопирован из Вот! не компилируется в моей настройке:
#include <iostream>
#include <string>
int main() {
std::string str("Test string");
for (std::string::iterator it = str.begin(); it != str.end(); ++it)
std::cout << *it;
std::cout << '\n';
return 0;
}
Точная ошибка (одна из них):
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\include\xutility(680): error : an explicit template argument list is not allowed on this declaration
1> _INLINE_VAR constexpr bool _Is_iterator_v<_Ty, void_t<_Iter_cat_t<_Ty>>> = true;
1> ^
1> detected during:
1> instantiation of "const bool std::_Is_iterator_v [with _Ty=char *, <unnamed>=void]" at line 520 of "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\include\string"1> instantiation of "std::basic_string<_Elem, std::char_traits<_Elem>, std::allocator<_Elem>> std::_Integral_to_string<_Elem,_Ty>(_Ty) [with _Elem=char, _Ty=int]" at line 554 of "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\include\string"
я нашел этот это указывает на то, что могут быть проблемы с конкретными используемыми версиями (ICC-17.0 Up6 и VS 15.6), однако я не могу действительно перейти на новый компилятор Intel и не могу протестировать VS 15.4
Я хотел бы записать, как мне удалось справиться с ошибкой № 2 из исходного вопроса, поскольку это может быть кому-то полезно.
Напомню, что вторые ошибки, которые я видел, были в xutility. С помощью всех, кто предоставил свои предложения, оказалось, что на самом деле icc не справлялся с очень простым кодом — для его «взлома» достаточно следующего
int main() {
std::string str("Test string");
}
Я разместил вопрос на форумах Intel, однако до сих пор не получил ответов (для версии компилятора 17.0). Ссылка на сайт Вот если кому-то интересно.
Тем не менее, я наткнулся на этот блог сообщение от команды VC ++, показывающей, что базовый набор инструментов, показанный как v141 в VC2017, на самом деле имел несколько незначительных изменений. Можно изменить версию набора инструментов MSVC, но это необходимо сделать путем редактирования файлов проекта (а не изменений параметров пользовательского интерфейса).
Мои тесты показывают, что версия 14.11 (которая является частью VS2017 15.3 и 15.4) работает для Intel 17.0, в то время как версии 14.12 и 14.13 (последняя — текущее значение по умолчанию для VS2017 15.6.4) — нет. Это было сделано для Обновления 6 компилятора. Таким образом, чтобы использовать компилятор Intel в Windows с Visual Studio, необходимо использовать определенные версии набора инструментов MSVC.
Примечание: я также установил обновление 1 для icc версии 18.0 для тестирования — оно также давало ошибки компилятора (и не только для меня на этот раз). Хотя причина может быть связана с некоторой внутренней проблемой для ICC, согласно этому сообщение на форуме. Я могу подтвердить, что удаление опции компилятора / permissive- из компилятора исправляет ошибки независимо от базовой цепочки инструментов. Использование v14.11 в качестве базового набора инструментов также решает эту конкретную проблему для меня с или без опции. / permissive- это новая опция для icc (она не является частью 17.0).
Вышесказанное решает более или менее вторую часть моей проблемы с ICC. Остальная часть вопроса (буста float128), хотя все еще остается. Я добавлю больше, если я услышу от парней Boost.
РЕДАКТИРОВАТЬ: ошибки, возникающие из-за повышения, оказались проблемой там — это было исправлено сопровождающими в ветке разработки, так что это также решается.
Для ошибки №1 я получил то же самое. Однако после комментирования блоков кода в boost float128.hpp, где были вызваны эти четыре функции, пример кода float128 может быть успешно скомпилирован. Побочный эффект неизвестен. Я с нетерпением жду пересмотра на boost :: multiprecision :: float128.