Botan编译错误VS2015

时间:2015-08-04 07:08:14

标签: c++ c++11 visual-studio-2015 botan

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

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

#include <botan/botan.h>

这是我得到的错误:

    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<Botan::secure_allocator<Botan::byte>>' 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<Botan::secure_allocator<Botan::byte>>' 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<Botan::secure_allocator<_Newfirst>>::_Wrap_alloc<std::_Wr
ap_alloc<Botan::secure_allocator<Botan::byte>>>(_Other &) noexcept' being compiled
        with
        [
            _Newfirst=std::_Container_proxy,
            _Other=std::_Wrap_alloc<Botan::secure_allocator<Botan::byte>>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(587): note: see reference to function template instantiation 'std::_Wrap_alloc<Botan::secure_allocator<_Newfirst>>::_Wrap_alloc<std::_Wr
ap_alloc<Botan::secure_allocator<Botan::byte>>>(_Other &) noexcept' being compiled
        with
        [
            _Newfirst=std::_Container_proxy,
            _Other=std::_Wrap_alloc<Botan::secure_allocator<Botan::byte>>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(585): note: while compiling class template member function 'void std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>::_Free_proxy(void)
'
        with
        [
            _Ty=Botan::byte,
            _Alloc=Botan::secure_allocator<Botan::byte>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(552): note: see reference to function template instantiation 'void std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>::_Free_proxy(voi
d)' being compiled
        with
        [
            _Ty=Botan::byte,
            _Alloc=Botan::secure_allocator<Botan::byte>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(679): note: see reference to class template instantiation 'std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>' being compiled
        with
        [
            _Ty=Botan::byte,
            _Alloc=Botan::secure_allocator<Botan::byte>
        ]
c:\Botan\include\botan-1.11\botan/rng.h(43): note: see reference to class template instantiation 'std::vector<Botan::byte,Botan::secure_allocator<Botan::byte>>' 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 个答案:

答案 0 :(得分:5)

查看sourcesBotan::secure_allocator似乎没有提供表单的模板构造函数

template<class U> secure_allocator(const secure_allocator<U>& other);

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

因此,我们不能责怪VC 14附带的标准库实现要求编译。在我看来,错误出现在Botan的一边。

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

template<class U> secure_allocator(const secure_allocator<U>&) BOTAN_NOEXCEPT { }

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

另一种可能的解决方法:

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

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

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

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

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