无法在 windows 上使用英特尔编译器编译示例 boost::multiprecision
Unable to compile example boost::multiprecision with intel compiler on windows
我正在使用 VS 2017 社区版、Intel Compiler 17.00 update 6 和 boost 1.66,试图了解 boost::multiprecision::float128。从字面上获取示例代码 here 并将其放入 VS 的新项目中。
编译出现多个错误,大致有两个categories/files:
在float128.hpp:
三个错误"error : identifier "xxx" is undefined" for fmaq, remquoq and remainderq。事实上,我无法找到它们的定义 - 缺少包含?
全局范围没有 "signbitq" - 这看起来又像是缺少定义(即与上面相同)
对于 GCC,上述功能在 quadmath.h 中找到,但是,在使用 ICC 时,boost header 似乎不包含它(即设置了 BOOST_MP_USE_QUAD)。
- 在 C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.13.26128\include\xutility:此声明中不允许显式模板参数列表。有3个计数
我假设我需要删除一些默认情况下从 VS 中放入的东西,但我不知道究竟是什么。
感谢您的帮助
编辑:上面的错误 #2 实际上根本不反对提升(我应该把它移到一个单独的问题吗?)。
从 here! 复制的以下代码未在我的设置中编译:
#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 Studio17\Community\VC\Tools\MSVC.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 Studio17\Community\VC\Tools\MSVC.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 Studio17\Community\VC\Tools\MSVC.13.26128\include\string"
我发现 这表明所使用的特定版本(ICC-17.0 Up6 和 VS 15.6)可能存在问题,但是我无法真正迁移到新的英特尔编译器并且我无法测试 VS 15.4
我想写下我是如何设法处理原始问题中的错误 #2 的,因为它可能对某些人有用。
提醒一下,我看到的第二个错误是在 xutility 中。在提供建议的每个人的帮助下,事实证明 icc 实际上在非常简单的代码上失败了 - 以下足以 "break" 它
int main() {
std::string str("Test string");
}
我已将问题发布到 intel 的论坛,但到目前为止我还没有收到答案(针对 17.0 版的编译器)。 Link here 如果有人感兴趣的话。
就是说,我从 VC++ 团队看到了这个博客 post,表明 VC2017 中显示为 v141 的基本工具集实际上已经进行了几次小的修改.可以更改 MSVC 工具链的版本,但这需要通过编辑项目文件(而不是 UI 参数更改)来实现。
我的测试表明版本 14.11(VS2017 15.3 和 15.4 的一部分)适用于 Intel 17.0,而版本 14.12 和 14.13(最后一个版本是 VS2017 15.6.4 的当前默认值)不适用。这已为编译器的更新 6 完成。因此,为了在 windows 和 visual studio 上使用英特尔编译器,需要使用特定的 MSVC 工具链版本。
旁注:我还安装了 icc 版本 18.0 更新 1 进行测试——它也给出了编译器错误(这次不仅仅是我)。根据这个forum post,那里的原因可能与 icc 的一些内部问题有关。我可以确认,无论基本工具链如何,从编译器中删除编译器选项 /permissive- 都会修复错误。使用 v14.11 作为基础工具链也为我解决了这个特殊问题,无论有没有选项。 /permissive- 是 icc 的新选项(它不是 17.0 的一部分)。
以上内容或多或少地解决了我的 icc 问题的第二部分。问题的其余部分(boost 的 float128)仍然存在。如果我听到 boost 的人的消息,我会添加更多内容。
编辑:来自 boost 的错误原来是那里的一个问题——它已被开发分支中的维护者修复,因此也已解决。
对于错误#1,我得到了同样的结果。但是,在对调用这四个函数的 boost float128.hpp 中的代码块进行注释后,可以成功编译 float128 示例代码。副作用未知。我期待 boost::multiprecision::float128.
的修订
我正在使用 VS 2017 社区版、Intel Compiler 17.00 update 6 和 boost 1.66,试图了解 boost::multiprecision::float128。从字面上获取示例代码 here 并将其放入 VS 的新项目中。
编译出现多个错误,大致有两个categories/files:
在float128.hpp:
三个错误"error : identifier "xxx" is undefined" for fmaq, remquoq and remainderq。事实上,我无法找到它们的定义 - 缺少包含?
全局范围没有 "signbitq" - 这看起来又像是缺少定义(即与上面相同)
对于 GCC,上述功能在 quadmath.h 中找到,但是,在使用 ICC 时,boost header 似乎不包含它(即设置了 BOOST_MP_USE_QUAD)。
- 在 C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.13.26128\include\xutility:此声明中不允许显式模板参数列表。有3个计数
我假设我需要删除一些默认情况下从 VS 中放入的东西,但我不知道究竟是什么。
感谢您的帮助
编辑:上面的错误 #2 实际上根本不反对提升(我应该把它移到一个单独的问题吗?)。 从 here! 复制的以下代码未在我的设置中编译:
#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 Studio17\Community\VC\Tools\MSVC.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 Studio17\Community\VC\Tools\MSVC.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 Studio17\Community\VC\Tools\MSVC.13.26128\include\string"
我发现
我想写下我是如何设法处理原始问题中的错误 #2 的,因为它可能对某些人有用。
提醒一下,我看到的第二个错误是在 xutility 中。在提供建议的每个人的帮助下,事实证明 icc 实际上在非常简单的代码上失败了 - 以下足以 "break" 它
int main() {
std::string str("Test string");
}
我已将问题发布到 intel 的论坛,但到目前为止我还没有收到答案(针对 17.0 版的编译器)。 Link here 如果有人感兴趣的话。
就是说,我从 VC++ 团队看到了这个博客 post,表明 VC2017 中显示为 v141 的基本工具集实际上已经进行了几次小的修改.可以更改 MSVC 工具链的版本,但这需要通过编辑项目文件(而不是 UI 参数更改)来实现。
我的测试表明版本 14.11(VS2017 15.3 和 15.4 的一部分)适用于 Intel 17.0,而版本 14.12 和 14.13(最后一个版本是 VS2017 15.6.4 的当前默认值)不适用。这已为编译器的更新 6 完成。因此,为了在 windows 和 visual studio 上使用英特尔编译器,需要使用特定的 MSVC 工具链版本。
旁注:我还安装了 icc 版本 18.0 更新 1 进行测试——它也给出了编译器错误(这次不仅仅是我)。根据这个forum post,那里的原因可能与 icc 的一些内部问题有关。我可以确认,无论基本工具链如何,从编译器中删除编译器选项 /permissive- 都会修复错误。使用 v14.11 作为基础工具链也为我解决了这个特殊问题,无论有没有选项。 /permissive- 是 icc 的新选项(它不是 17.0 的一部分)。
以上内容或多或少地解决了我的 icc 问题的第二部分。问题的其余部分(boost 的 float128)仍然存在。如果我听到 boost 的人的消息,我会添加更多内容。
编辑:来自 boost 的错误原来是那里的一个问题——它已被开发分支中的维护者修复,因此也已解决。
对于错误#1,我得到了同样的结果。但是,在对调用这四个函数的 boost float128.hpp 中的代码块进行注释后,可以成功编译 float128 示例代码。副作用未知。我期待 boost::multiprecision::float128.
的修订