boost库无法编译c ++ 11并适用于c ++ 98

时间:2017-01-05 13:48:19

标签: c++ c++11 boost

由于c++11库,我在尝试使用boost标准编译项目时遇到问题。 当我使用c++98标准编译它时没有问题,我不明白为什么。

我使用next命令编译(c ++ 11):

g++ -c -pipe -O2 -fPIC -std=gnu++11 -Wall -W -D_REENTRANT -DENABLE_IPV6 -DTIXML_USE_STL -DBOOST_FILESYSTEM_DEPRECATED -I. -I/usr/include -o obj/test.o ../src/net/common/test.cpp

要使用c++98标准进行编译,我使用相同的命令,除了我删除-std标志。我使用g++ 5.4.0。因此,它默认使用c++98标准

其输出(c++11):

In file included from /usr/include/boost/asio/detail/throw_error.hpp:19:0,
                 from /usr/include/boost/asio/detail/impl/posix_tss_ptr.ipp:23,
                 from /usr/include/boost/asio/detail/posix_tss_ptr.hpp:76,
                 from /usr/include/boost/asio/detail/tss_ptr.hpp:27,
                 from /usr/include/boost/asio/detail/call_stack.hpp:20,
                 from /usr/include/boost/asio/impl/handler_alloc_hook.ipp:19,
                 from /usr/include/boost/asio/handler_alloc_hook.hpp:80,
                 from /usr/include/boost/asio/detail/handler_alloc_helpers.hpp:21,
                 from /usr/include/boost/asio/detail/bind_handler.hpp:19,
                 from /usr/include/boost/asio/detail/wrapped_handler.hpp:18,
                 from /usr/include/boost/asio/io_service.hpp:24,
                 from /usr/include/boost/asio/basic_io_object.hpp:19,
                 from /usr/include/boost/asio/basic_socket.hpp:20,
                 from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
                 from /usr/include/boost/asio.hpp:21,
                 from ../src/net/test.h:36,
                 from ../src/net/common/test.cpp:32:
/usr/include/boost/system/error_code.hpp:190:32: error:   overriding ‘virtual const char* boost::system::error_category::name() const noexcept’
       virtual const char *     name() const BOOST_SYSTEM_NOEXCEPT = 0;
                                ^

我可能错了,但看起来boost无法检测到我为c++11设置了标志 这就是我尝试使用

查看定义了哪些宏的原因
g++ -E -dM -pipe -O2 -fPIC -std=gnu++11 -Wall -W -D_REENTRANT -DENABLE_IPV6 -DTIXML_USE_STL -DBOOST_FILESYSTEM_DEPRECATED -I. -I/usr/include ../src/net/common/test.cpp > obj/test_11.txt 

我为c++98做了同样的事情。它的输出:

c++98

// it does not set __GXX_EXPERIMENTAL_CXX0X__
#define BOOST_NOEXCEPT 
#define BOOST_SYSTEM_NOEXCEPT BOOST_NOEXCEPT

c++11

#define __GXX_EXPERIMENTAL_CXX0X__ 1 //It sets c++11 macro 
#define BOOST_NOEXCEPT noexcept
#define BOOST_SYSTEM_NOEXCEPT BOOST_NOEXCEPT

好像不行,不是吗?它在BOOST_NOEXCEPT中将noexcept定义为c++11,在c++98

中将其定义为空白

我不是c++的专家(c++11也不是c++98),所以我在这里迷失了方向。任何的想法?

备注
Boost Libraries版本(/usr/include/boost/version.hpp):#define BOOST_VERSION 106000

1 个答案:

答案 0 :(得分:0)

根据您的日志文件,尚未设置宏BOOST_SYSTEM_NOEXCEPT。因为您还没有提供完整的源代码,所以我只能假设包含升压头的顺序是错误的。如果订单是正确的,宏BOOST_SYSTEM_NOEXCEPT将被定义正确(查看一些涉及的增强源文件)。

但是,如果我们仅使用#include < asio.hpp> ,则需要有关源代码等的更多信息。

无论这些内容如何,​​我都建议您更新到最新版本的boost。