2013-09-13 1 views
5

Если 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 /).

ответ

2

Вы не хотите связать проект с C++ 11 с не-C++ 11 библиотек. C++ 11 прерывает двоичную совместимость, и, хотя в большинстве случаев это может сработать, в какой-то момент он укусит вас в прикладе.

См. Также do we need to recompile libraries with c++11?

+1

Хорошо, спасибо. Если я правильно понимаю эту ссылку, они хотят использовать C++ 11, для чего потребуется 'gcc-4.7' +. У них уже есть двоичные файлы, скомпилированные с '4.2.1'. Им придется перекомпилировать двоичные файлы независимо от использования C++ 11 или нет, потому что они меняются между основным выпуском gcc (который разработчики gcc рассматривают как изменение в основных или младших номерах выпуска) –

+0

Должен признаться, что я не прочитал ссылку, я должен был бы :). В любом случае компиляция проекта с gcc-4.7 с -stdC++ 11 и связь с библиотекой, скомпилированной с gcc-4.7 без -std = C++ 11, не очень хорошая идея. Также обратите внимание, что некоторые заголовки могут иметь предварительный процессор #, если он основан на наличии поддержки C++ 11 или нет. Эти # if будут оценивать по-разному при компиляции проекта C++ 11 по сравнению с библиотекой C++ 03. Который может или не может нарушить совместимость. Это также подходит для смешивания сборок и отладки. – thelamb

+0

Не беспокойтесь, я согласен с вами - просто уточните ссылку;) –

Смежные вопросы