OS X clang C ++ 11和libstdc ++增强了编译问题

时间:2015-10-07 18:36:37

标签: c++ c++11 boost libstdc++ libc++

我已经编译了两个Boost库版本 - 同样是1.54和1.58:

$ mkdir build && ./bootstrap --prefix=$(pwd)/build
$ ./b2 cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++" && ./b2 install

现在,我正在尝试编译这个小应用程序:

#include <boost/asio.hpp>
#include <boost/asio/steady_timer.hpp>

boost::asio::io_service io_service_;
boost::asio::steady_timer timer_(io_service_);

int
main ()
{
  return 0;
}
像这样:     $ g ++ -c -std = gnu ++ 11 -stdlib = libstdc ++ -I main.cpp

它为Boost 1.54.0完美编译并为Boost 1.58.0提供错误(超过20个):

boost_1_58_0/build/include/boost/asio/detail/addressof.hpp:31:12: error: no member named 'addressof' in namespace 'std'
using std::addressof;
boost_1_58_0/build/include/boost/asio/detail/handler_alloc_helpers.hpp:37:56: error: no member named 'addressof' in namespace 'boost::asio::detail'
  return asio_handler_allocate(s, boost::asio::detail::addressof(h));
                                  ~~~~~~~~~~~~~~~~~~~~~^
boost_1_58_0/build/include/boost/asio/detail/handler_alloc_helpers.hpp:48:54: error: no member named 'addressof' in namespace 'boost::asio::detail'
  asio_handler_deallocate(p, s, boost::asio::detail::addressof(h));
...

我想,这是OS X特定的,并且与我传递的-std-stdlib标志有关,因为如果我同时提供其中一个而不是两个,则编译。我已经阅读了很多关于libc++libstdc++的内容,但我需要这些标志作为我的真实代码(人们可能已经猜到这只是一个演示代码)需要这些标志才能被编译,例如我必须使用libstdc ++而不是libc ++,我需要C ++ 11。

有没有关于如何在不放弃这些编译器标志的情况下使用最新的boost库的建议?

1 个答案:

答案 0 :(得分:0)

尝试使用-DBOOST_NO_CXX11_ADDRESSOF进行编译。

也许你可以使用-stdlib=libc++ -lstdc++标志编译代码(而不是boost)(OS X上的程序可以同时使用)。