1

我一直在使用 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,但我仍然看到同样的错误。

4

2 回答 2

2

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

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

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

于 2018-07-01T12:02:23.627 回答
2

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

于 2018-07-02T13:51:20.213 回答