使用 MSVC _MANAGED (C++/CLI) 在非 C++03 模式下编译 Boost.Regex 1.76?

问题描述

TL;DR

是否可以使用 C++/CLI ie BOOST_REGEX_CXX03 ie /clr 项目在仅标头模式( _MANAGED 模式)下编译 Boost.Regex 1.76 ?


多年来,我们一直在常规 Visual C++ 项目中使用 Boost.Regex。我们的少数项目是使用启用 C++/CLICommon Language Runtime Support (/clr) 编译的(对于这些我们总是静态链接到 boost regex 库中)。我们总是预先构建 boost regex DLL 和静态库,然后从 MSVC 链接这些。

现在,with Boost 1.76 Boost.Regex 只是文件,除非在 C++03 模式下编译。

( 版本 1.76.0 ) ...

正则表达式:

  • Regex 现在仅作为标题,C++03 模式除外
  • 现已弃用对 C++03 的支持
  • ...

然而,我们的 C++/CLI 项目将——通过 boost 配置魔法——自动选择在 C++03 == BOOST_REGEX_CXX03 模式下构建 Boost.Regex!

  • 我们当前的 MSVC 是 Visual Studio 19.7.6,_MSC_FULL_VER 192729112

由于不再需要预先构建任何 Boost.Regex 二进制文件会非常方便,我们目前正在研究是否可以在 中编译 C++/CLI 项目非 BOOST_REGEX_CXX03 模式:

  • 有谁知道如何通过 boost/config 的魔法为 C++ BOOST_REGEX_CXX03 项目选择宏 _MANAGED? (我目前怀疑 _CPPLIB_VER,但我什至不确定它是什么版本。)
  • 我们可以切换这个吗? ->

是否可以使用 C++/CLI 即 /clr_MANAGED 项目在仅标头模式下编译 Boost.Regex 1.76?

解决方法

快速回答问题:不可能在C++11模式下编译Boost.Regex,即非C++03模式打开 /clr 标志。

BOOST_REGEX_CXX03 下选择 /clr 的原因是,如果设置了 boost\regex\config.hpp 中的任何一个,... BOOST_NO_CXX11_HDR_MUTEX ... BOOST_NO_CXX11_HDR_ATOMIC ... 将选择它,并且 这些在 {{1} 下设置}} 因为 C++/CLI 只支持 C++03,或者更确切地说它支持所有的 C++03 而例如C++/CLI 不支持 /clr

作为others have written

不支持,因为 std::mutex 实现使用 获取当前线程 ID()。这是一个不应该的winapi函数 在托管代码中使用,因为它可能在自定义 CLR 主机上运行 不使用线程来实现线程。

这是一个很好的问题,它表明你是 构建您的代码错误。您的本机 C++ 正在使用 /clr 进行编译 有效。哪个工作得很好,所有符合 C++03 的代码都可以 编译为 MSIL ....

所以,IFF 你需要在编译std::mutex 的翻译单元中使用 Boost.regex,你必须使用 C++03 模式。

至于 OP 问题:应该检查给定的使用 C++/CLI 的 VC++ 项目是否真的需要在 /clr 上编译所有文件,或者实际上使用 Boost.Regex 的翻译单元无论如何都是本机 C++,并且可能是不使用 /clr 编译,然后与 C++/CLI 对象文件链接在一起。