Если Boost скомпилирован без Поддержка C++ 11 boost::filesystem
использует эмулированные подсвеченные энкодераторы. Если вы затем берете этот встроенный Boost и используете его в проекте с поддержкой C++ 11, вы получите недостающий символ, потому что объявление boost::filesystem::copy_file()
изменилось.boost :: filesystem :: copy_file() отсутствует символ в C++ 11
Существует простой исправить это:
# if __cplusplus >= 201103L
# define NO_SCOPED_ENUMS
# endif
# ifdef NO_SCOPED_ENUMS
# if BOOST_VERSION < 105000
# ifndef BOOST_NO_SCOPED_ENUMS
# define BOOST_NO_SCOPED_ENUMS
# define REMOVE
# endif
# else
# ifndef BOOST_NO_CXX11_SCOPED_ENUMS
# define BOOST_NO_CXX11_SCOPED_ENUMS
# define REMOVE
# endif
# endif
# endif
# include "boost/filesystem.hpp"
# if defined(NO_SCOPED_ENUMS) && defined(REMOVE)
# undef REMOVE
# if BOOST_VERSION < 105000
# undef BOOST_NO_SCOPED_ENUMS
# else
# undef BOOST_NO_CXX11_SCOPED_ENUMS
# endif
# endif
Это предобработки бит определяет либо BOOST_NO_SCOPED_ENUMS
или BOOST_NO_CXX11_SCOPED_ENUMS
в зависимости от версии Boost, включает в себя boost/filesystem
, а затем удаляет его снова, если она не была определена ранее (в быть безопасным)
Теперь вопрос здесь, что область видимости счетчиков выключается, когда мы составляем для C++ 11:
# if __cplusplus >= 201103L
# define NO_SCOPED_ENUMS
# endif
Однако, если Boost фактически был скомпилирован с Поддержка C++ 11, это снова сломается, потому что объявление будет изменено. Это должно быть что-то вроде:
// BOOST_COMPILED_WITH_CXX11 doesn't exist
# if (__cplusplus >= 201103L) && !defined(BOOST_COMPILED_WITH_CXX11)
# define NO_SCOPED_ENUMS
# endif
Это где мой вопрос приходит в:
ТЛ, др - Можно ли определить, подталкивания был скомпилирован с C++ 11 поддержки?
Ближайшим Я found является:
Однако вы запустите скрипт конфигурации, когда он закончит вы найдете новый заголовок -
user.hpp
- находится в каталоге<boost-root>/libs/config/
. Обратите внимание, что configure не устанавливает этот заголовок в ваш boost include path по умолчанию. Этот заголовок содержит все параметры, сгенерированные скриптом configure, а также заголовок, который содержит настраиваемые пользователем параметры из версии по умолчанию (находится в/boost/config /).
Хорошо, спасибо. Если я правильно понимаю эту ссылку, они хотят использовать C++ 11, для чего потребуется 'gcc-4.7' +. У них уже есть двоичные файлы, скомпилированные с '4.2.1'. Им придется перекомпилировать двоичные файлы независимо от использования C++ 11 или нет, потому что они меняются между основным выпуском gcc (который разработчики gcc рассматривают как изменение в основных или младших номерах выпуска) –
Должен признаться, что я не прочитал ссылку, я должен был бы :). В любом случае компиляция проекта с gcc-4.7 с -stdC++ 11 и связь с библиотекой, скомпилированной с gcc-4.7 без -std = C++ 11, не очень хорошая идея. Также обратите внимание, что некоторые заголовки могут иметь предварительный процессор #, если он основан на наличии поддержки C++ 11 или нет. Эти # if будут оценивать по-разному при компиляции проекта C++ 11 по сравнению с библиотекой C++ 03. Который может или не может нарушить совместимость. Это также подходит для смешивания сборок и отладки. – thelamb
Не беспокойтесь, я согласен с вами - просто уточните ссылку;) –