C++ Boost-iostream:包含 filtering_streambuf.hpp 时出现神秘错误
C++ Boost-iostream: mysterious error when including filtering_streambuf.hpp
我一直在使用 boost iostream 库(1.65 版),主要使用以下 header:<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 headers 之后,我得到了这个神秘的编译错误:
/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 中的错误?
我实际上 down-graded 我提高到 1.58,但我仍然看到同样的错误。
是的,这看起来像是版本冲突。
请注意,由于它是 access_control 实现细节上的编译错误,很可能是由于不同的编译器 flags/config 导致编译的代码不同。 这将是一个问题,即使所有包含都来自同一个 Boost 版本。
特别是,代码的某些部分可能会对目标平台做出(不同的)假设。
我发现这是定义的问题。 Microsoft 代码定义了一个宏调用 U(x)
,而 Boost 代码使用 U 作为模板变量。在导入微软代码头前加上#define _TURN_OFF_PLATFORM_STRING
后,问题解决。
我一直在使用 boost iostream 库(1.65 版),主要使用以下 header:<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 headers 之后,我得到了这个神秘的编译错误:
/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 中的错误?
我实际上 down-graded 我提高到 1.58,但我仍然看到同样的错误。
是的,这看起来像是版本冲突。
请注意,由于它是 access_control 实现细节上的编译错误,很可能是由于不同的编译器 flags/config 导致编译的代码不同。 这将是一个问题,即使所有包含都来自同一个 Boost 版本。
特别是,代码的某些部分可能会对目标平台做出(不同的)假设。
我发现这是定义的问题。 Microsoft 代码定义了一个宏调用 U(x)
,而 Boost 代码使用 U 作为模板变量。在导入微软代码头前加上#define _TURN_OFF_PLATFORM_STRING
后,问题解决。