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
那么这部分构建就会成功;当然它仍然坏了但它在别处。这让我想到了以下问题?
_MSC_VER
、BOOST_MSVC
和 __MINGW32__
标志、值或设置,如何确定这一点?
- 哪里可以 enable/disable/set/assign/alter/override 这些值?那就是他们定义的地方,例如命令行开关,其他 header/configuration 文件,怎么知道这个?
- 如何在 Visual Studio 2019 年的编译过程中确定这些 variables/constants 中的哪些是 active/effective?
- 应该为我正在编译的项目做这件事,还是应该为依赖做这件事,在这种情况下是提升?
- 按照我所描述的那样简单地编辑头文件通常是不好的做法。有没有更好的方法来修补文件?为什么 C 不检查它是否已更改并引发其他错误?
- 我应该寻找另一个版本的库来解决这个问题,还是应该将此作为错误报告给开发人员,再次针对主包或 boost?
注意: 我知道这些可能是介绍性问题,但我并不经常使用 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),我建议您先更新它并检查问题是否已经解决。
我正在尝试在 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
那么这部分构建就会成功;当然它仍然坏了但它在别处。这让我想到了以下问题?
_MSC_VER
、BOOST_MSVC
和__MINGW32__
标志、值或设置,如何确定这一点?- 哪里可以 enable/disable/set/assign/alter/override 这些值?那就是他们定义的地方,例如命令行开关,其他 header/configuration 文件,怎么知道这个?
- 如何在 Visual Studio 2019 年的编译过程中确定这些 variables/constants 中的哪些是 active/effective?
- 应该为我正在编译的项目做这件事,还是应该为依赖做这件事,在这种情况下是提升?
- 按照我所描述的那样简单地编辑头文件通常是不好的做法。有没有更好的方法来修补文件?为什么 C 不检查它是否已更改并引发其他错误?
- 我应该寻找另一个版本的库来解决这个问题,还是应该将此作为错误报告给开发人员,再次针对主包或 boost?
注意: 我知道这些可能是介绍性问题,但我并不经常使用 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),我建议您先更新它并检查问题是否已经解决。