Почему boost.log аварийно завершает работу в Windows XP?

Я использую boost.log. Помимо огромного количества agro на самом деле получает и строит его, он нормально работает в Windows 7 и Vista.

Сейчас я пытаюсь использовать приложение в Windows XP, но boost.log вылетает с необработанным исключением (Access violaton reading location 0x00000000).

Это происходит в методе log:mt_nt5::sources::aux::set_severity_level, где он пытается установить статическую глобальную переменную с именем g_SeverityLevel.

Я нашел документ, в котором предлагается сборка с BOOST_LOG_NO_COMPILER_TLS. Я пробовал это, но это не сработало.

Я прочитал подробнее об этом, и проблема, похоже, связана с глобальная переменная объявляется как __declspec(thread), что делает поток статическим. Это проблема только с операционными системами до Vista.

Я статически подключаюсь к boost.log, поэтому не могу понять, почему мой препроцессор BOOST_LOG_NO_COMPILER_TLS не распознается.

Я что-то упускаю?

Обновление:

Что бы я ни делал при сборке библиотек с bjam, мой флаг BOOST_LOG_NO_COMPILER_TLS не распознается. Я строю так:

bjam address-model=32 --toolset=msvc-10.0 --build-type=complete 
  --with-log variant=debug link=static runtime-link=static   
  define=BOOST_LOG_NO_COMPILER_TLS stage

Я сравнил содержимое вывода в папке stage после сборки с этим флагом и без него, и содержимое идентично!

Поэтому теперь, вероятно, возник бы связанный с этим вопрос: правильно ли я использую командную строку bjam?


person Steve Dunn    schedule 22.12.2011    source источник
comment
Вы случайно не используете VC++ и компилируете с помощью /clr?   -  person ildjarn    schedule 22.12.2011
comment
Я использую VC++ (Visual Studio 2010), но не использую /clr   -  person Steve Dunn    schedule 22.12.2011
comment
Какая версия ХР? Для VC++ 2010 требуется, чтобы целевая платформа была как минимум XP SP2.   -  person ildjarn    schedule 22.12.2011


Ответы (1)


Он дает сбой, потому что использует статические объявления потока. Как описано в статьях, ссылки на которые приведены выше, это вызывает проблемы в операционных системах до Vista, если DLL, содержащая код ведения журнала, загружается с помощью LoadLibrary (которая также охватывает компоненты COM).

Если у вас возникла эта проблема, перекомпилируйте библиотеку boost.log, но не забудьте сначала очистить папку bin.v2!

person Steve Dunn    schedule 23.12.2011
comment
у меня все еще есть проблема. Я использую Boost в качестве общей библиотеки на платформе Windows, предъявляя иск VC++ 2010. Он работает как обычный exe, но падает, когда журнал повышения используется внутри службы Windows. любая идея? - person Pritesh Acharya; 12.09.2014