无法在Windows

时间:2018-03-07 15:43:02

标签: c++ visual-studio boost icc boost-multiprecision

我正在使用VS 2017社区版,英特尔编译器17.00更新6和增强1.66,试图了解我的方法boost :: multiprecision :: float128。直接从here获取示例代码并将其放入VS的新项目中。

编译在大致两个类别/文件中提供了多个错误:

  1. 在float128.hpp中:

    • "错误的三个错误:标识符" xxx"未定义"对于fmaq,remquoq和remainderq。事实上,我无法找到它们的定义 - 缺少包括?

    • 全球范围没有" signbitq" - 这再次看起来像缺少定义(即与上面相同)

  2. 对于GCC,上面的函数可以在quadmath.h中找到,但是,当使用ICC(即设置了BOOST_MP_USE_QUAD)时,boost头似乎不包括它。

    1. 在C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.13.26128 \ include \ xutility:此声明中不允许显式模板参数列表。有三个计数
    2. 我认为我需要删除默认情况下从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 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"
      

      我发现this表示使用的特定版本可能存在问题(ICC-17.0 Up6和VS 15.6),但我无法真正转移到新的英特尔编译器,我无法测试VS 15.4

2 个答案:

答案 0 :(得分:0)

我想写下我如何设法处理原始问题中的错误#2,因为它可能对某人有用。

提醒一下,我看到的第二个错误是xutility。在提供建议的每个人的帮助下,事实证明icc实际上在非常简单的代码上失败了 - 以下就足以“打破”它了

int main() { std::string str("Test string"); }

我已将问题发布到英特尔论坛,但到目前为止我还没有收到答案(对于17.0版本的编译器)。如果有人有兴趣,请链接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的当前默认值)则不适用。这已针对编译器的Update 6完成。因此,为了在带有visual studio的windows上使用intel编译器,需要使用特定的MSVC工具链版本。

旁注:我还安装了icc版本18.0更新1进行测试 - 它也给编译器错误(这次不仅仅是对我而言)。根据{{​​3}},这里的原因可以与icc的一些内部问题相关联。我可以确认从编译器中删除编译器选项/ permissive-可以修复错误,而不管基本工具链。使用v14.11作为基本工具链也可以在有或没有选项的情况下为我解决这个特殊问题。 / permissive-是icc的新选项(它不是17.0的一部分)。

以上解决了icc问题的第二部分或多或少。问题的其余部分(boost的float128)仍然存在。如果我听到来自那些家伙的话,我会补充更多。

编辑:来自boost的错误在那里成了一个问题 - 它由开发分支的维护者修复,所以这也得到了解决。

答案 1 :(得分:0)

对于错误1,我有同样的想法。但是,在注释了调用了这四个函数的boost float128.hpp中的代码块之后,可以成功编译float128示例代码。副作用未知。我期待对boost :: multiprecision :: float128进行修订。