【问题标题】:C++ Boost-iostream: mysterious error when including filtering_streambuf.hppC ++ Boost-iostream:包含filtering_streambuf.hpp时出现神秘错误
【发布时间】:2018-06-30 23:00:35
【问题描述】:

我一直在使用 boost iostream 库(1.65 版),主要使用以下标头:<boost/iostreams/filtering_streambuf.hpp> ,没有问题。

在我将另一个名为 cpprest 的库添加到我的项目后 (https://github.com/Microsoft/cpprestsdk)。我在我的 cmake 中收到此警告:

usr/bin/ld: warning: libboost_system.so.1.58.0, needed by /usr/lib/libcpprest.so, may conflict with libboost_system.so.1.65.0

在包含 boost 头文件后,我得到了这个神秘的编译错误:

/usr/local/include/boost/iostreams/detail/access_control.hpp: In constructor ‘boost::iostreams::detail::prot_<U>::prot_(V)’:
/usr/local/include/boost/iostreams/detail/access_control.hpp:37:43: error: class ‘boost::iostreams::detail::prot_<U>’ does not have any field named ‘v’
         template<typename V> prot_(V v) : U(v) { }

这是由于 Boost 1.58(cpprest 使用的)和 1.65 不兼容造成的吗?还是 Boost iostream 中的错误?

我实际上将我的提升降级到 1.58,但我仍然看到同样的错误。

【问题讨论】:

    标签: c++ boost boost-iostreams cpprest-sdk


    【解决方案1】:

    是的,这看起来像是版本冲突。

    请注意,由于它是关于 access_control 实现细节的编译错误,很可能是由于不同的编译器标志/配置导致编译的代码不同。即使全部包含,这也会是一个问题来自同一个 Boost 版本。

    特别是,代码的某些部分可能对目标平台做出(不同的)假设。

    【讨论】:

    • 经过长时间的搜索,我发现这是定义的问题。 Microsoft 代码定义了一个宏调用 U(x),而 Boost 代码使用 U 作为模板变量。 :) 添加#define _TURN_OFF_PLATFORM_STRING 后问题得到解决。有没有办法以其他方式检测这些碰撞?因为编译器消息不是很有帮助。
    • 如果您只是查看与编译器相同的代码,编译器消息将非常有意义。 IE。下次您应该尝试查看预处理的源代码(并避免混合不同库的标头,当它们不是标头干净时。可悲的是,这是 Microsoft 库的一个痛苦传统(例如,windows.h 是一个非常大的违规者))
    • 附言。您可以添加自己的答案并接受它。很高兴您发现我的回答很有帮助,但您自己找到了罪魁祸首
    【解决方案2】:

    我发现这是定义的问题。 Microsoft 代码定义了一个宏调用 U(x),而 Boost 代码使用 U 作为模板变量。在导入微软代码头前添加#define _TURN_OFF_PLATFORM_STRING后,问题解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多