Visual Studio: 正在解决项目依赖的构建 Flags/Settings

Visual Studio: Resolving build Flags/Settings for a project dependency

我正在尝试在 windows Visual Studio 2019 年编译一个 C/C++ 库,该库最初是为 *nix 系统开发的,但它在依赖项中遇到了障碍;在这种情况下提升。报错如下:

Error C2039 '_snprintf': is not a member of 'std'

我认为以下是令人震惊的台词:

#if ( defined(_MSC_VER) && _MSC_VER < 1900 ) || ( defined(__MINGW32__) && 
!defined(__MINGW64_VERSION_MAJOR) )

inline char const * unknown_message_win32( int ev, char * buffer, std::size_t len )
{
# if defined( BOOST_MSVC )
#  pragma warning( push )
#  pragma warning( disable: 4996 )
# endif

    _snprintf( buffer, len - 1, "Unknown error (%d)", ev );

    buffer[ len - 1 ] = 0;
    return buffer;

# if defined( BOOST_MSVC )
#  pragma warning( pop )
# endif
}

#else

inline char const * unknown_message_win32( int ev, char * buffer, std::size_t len )
{
    std::snprintf( buffer, len, "Unknown error (%d)", ev );
    return buffer;
}

#endif

另一个论坛讨论了 std::snprintf 已经映射到或现在映​​射到标准库中的 std::_snprintf,而这在不久前是 deprecated/implemented。事实上,如果我删除 && _MSC_VER < 1900 那么这部分构建就会成功;当然它仍然坏了但它在别处。这让我想到了以下问题?

注意: 我知道这些可能是介绍性问题,但我并不经常使用 C/C++。我发现所有有趣的 C/C++ 库都很难构建,并且在花了一两天的时间为编译器设置适当的构建系统后,人们就失去了兴趣,不仅针对包本身,而且针对每个它的依赖关系。更常见的情况是,这些说明是神秘的、简洁的 and/or 过时的,几乎每个工具都想以某种方式破坏系统的配置。这似乎是一个很好的例子,可以简洁地隔离问题,确定其原因并一次解决我的一些查询。

_MSVC_VER 由编译器本身定义,并且在使用 MSVC 时始终存在(我相信在使用通过 VS 分发的 clang 时它也会存在,但我不确定)。 BOOST_VER 将在提升 header 秒之后(和中间)出现。 BOOST_VER 在 boost header 级联的早期定义。 __MINGW64_VER w 只会在使用 mingw 工具集时定义。

如果问题出现在 boost header 中的某处(根据你的描述,我怀疑是这种情况)那么是的,boost 是通知该问题的合适包。如果你能提供一个看起来不会影响其他任何东西的修复程序,他们就更有可能采取行动(在提升库方面并不总是一件容易的事)。并且

此外,如果您的 boost 库不是最新的(现在是 1.75,很快就会是 1.76),我建议您先更新它并检查问题是否已经解决。