Проблемы с компиляцией OS X clang C++11 и libstdc++ boost

Я скомпилировал две версии библиотеки 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 и выдает ошибки (более 20) для Boost 1.58.0:

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.

Есть ли какие-либо предложения о том, как использовать последние библиотеки повышения, не отказываясь от этих флагов компилятора?


person peetonn    schedule 07.10.2015    source источник


Ответы (2)


Попробуйте скомпилировать с -DBOOST_NO_CXX11_ADDRESSOF.

Также, возможно, вы можете скомпилировать свой код (не повысить) с использованием флагов -stdlib=libc++ -lstdc++ (программам на OS X разрешено использовать оба одновременно).

person Anton Malyshev    schedule 07.10.2015

// Standard library support for addressof.
#if !defined(BOOST_ASIO_HAS_STD_ADDRESSOF)
# if !defined(BOOST_ASIO_DISABLE_STD_ADDRESSOF)
#  if defined(__clang__)
#   if defined(BOOST_ASIO_HAS_CLANG_LIBCXX)
#    define BOOST_ASIO_HAS_STD_ADDRESSOF 1
#   elif (__cplusplus >= 201103)
#    define BOOST_ASIO_HAS_STD_ADDRESSOF 1
#   endif // (__cplusplus >= 201103)
#  endif // defined(__clang__)
...

Похоже, что проверка на std::addressof в boost 1.58 и выше неверна при использовании clang с libstdc++ и c++11. Если ваш libstdc++ слишком стар, то boost попытается использовать std::addressof, даже если libstdc++ его не реализует. Похоже, вы можете определить BOOST_ASIO_DISABLE_STD_ADDRESSOF, чтобы обойти эту проблему.

person Miles Budnek    schedule 07.10.2015
comment
libstdc++, который Apple поставляет для Mac OS X, довольно стар. (4.2.1, IIRC). - person Marshall Clow; 07.10.2015