当前位置:  开发笔记 > 编程语言 > 正文

Botan编译错误VS2015

如何解决《Botan编译错误VS2015》经验,为你挑选了1个好方法。

我这里有一个奇怪的情况.我正在尝试使用带有VS2015的Botan加密库(因为项目的其他部分使用了一些VS2013无法编译的重C++ 11代码)并且我得到了很长的编译错误(见下文).

在尝试了各种各样的事情之后,我得出结论,即使编译的c ++源文件中包含一个botan头文件,编译器也会抛出下面的错误.现在我在文件中只有一行:

#include 

这是我得到的错误:

    C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\xmemory0(876): error C2664: 'Botan::secure_allocator<_Newfirst>::secure_allocator(const Botan::secure_allocator<_Newfirst> &)': cannot convert
argument 1 from 'std::_Wrap_alloc>' to 'const Botan::secure_allocator<_Newfirst> &'
        with
        [
            _Newfirst=std::_Container_proxy
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\xmemory0(876): note: Reason: cannot convert from 'std::_Wrap_alloc>' to 'const Botan::secure_allocator<_Ne
wfirst>'
        with
        [
            _Newfirst=std::_Container_proxy
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\xmemory0(876): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(587): note: see reference to function template instantiation 'std::_Wrap_alloc>::_Wrap_alloc>>(_Other &) noexcept' being compiled
        with
        [
            _Newfirst=std::_Container_proxy,
            _Other=std::_Wrap_alloc>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(587): note: see reference to function template instantiation 'std::_Wrap_alloc>::_Wrap_alloc>>(_Other &) noexcept' being compiled
        with
        [
            _Newfirst=std::_Container_proxy,
            _Other=std::_Wrap_alloc>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(585): note: while compiling class template member function 'void std::_Vector_alloc>::_Free_proxy(void)
'
        with
        [
            _Ty=Botan::byte,
            _Alloc=Botan::secure_allocator
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(552): note: see reference to function template instantiation 'void std::_Vector_alloc>::_Free_proxy(voi
d)' being compiled
        with
        [
            _Ty=Botan::byte,
            _Alloc=Botan::secure_allocator
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(679): note: see reference to class template instantiation 'std::_Vector_alloc>' being compiled
        with
        [
            _Ty=Botan::byte,
            _Alloc=Botan::secure_allocator
        ]
c:\Botan\include\botan-1.11\botan/rng.h(43): note: see reference to class template instantiation 'std::vector>' being compiled
NMAKE : fatal error U1077: 'C:\PROGRA~1\MICROS~3.0\VC\bin\cl.exe' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.

由于我能够编译和运行botan测试,我感觉我错过了什么,但我不知道是什么.有没有人有这方面的经验?(顺便说一下:相同的代码与g ++ 4.9编译得很好)



1> bogdan..:

查看源代码,似乎Botan::secure_allocator没有提供表单的模板构造函数

template secure_allocator(const secure_allocator& other);

这是标准所要求的.在目前的工作草案N4527中,相关位在[17.6.3.5]表28中 - 分配器要求; 第9段中的例子也很有用.

因此,我们不能责怪VC 14附带的标准库实现,以便编译.在我看来,错误在Botan方面.


快速解决方法是将此类定义添加到Botan::secure_allocator:

template secure_allocator(const secure_allocator&) BOTAN_NOEXCEPT { }

由于此分配器模板的实例化没有任何非静态数据成员,因此空体应该没问题.但是,我不熟悉这个库,我们在这里谈论加密,所以,在使用它来做任何严肃的事情之前,请与图书馆作者确认更改.


另一种可行的解决方法

我注意到调用混合类型构造函数的代码似乎只在启用迭代器调试时启用,默认情况下在调试模式下会发生.

您是否尝试在发布模式下进行编译?如果我的观察结果是正确的,那么你将不再得到这个错误,因为迭代器调试的附加机制将被禁用.

要在调试模式下获得相同的行为,请将_ITERATOR_DEBUG_LEVEL宏设置为0全局.

调试迭代器对于检测错误非常有用(只要性能命中对您没有影响),所以我不会将其用作永久修复,但如果您不想使用它作为临时解决方法可能很有用修改Botan头文件.

这也可以解释为什么你能够编译测试:也许它们是在发布模式下编译的,或者,无论如何,使用禁用迭代器调试的设置组合?


@ j00hi根据Simon Warta的[上面的评论](http://stackoverflow.com/questions/31802806/botan-compile-error-vs2015/31805705?noredirect=1#comment52773233_31802806),版本1.11.20包括修复程序.如果您需要使用旧版本并希望手动应用更改,则差异是[此处](https://github.com/randombit/botan/pull/236/files).
推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有