Защо 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 не се разпознава.

Изпускам ли нещо?

Актуализация:

Без значение какво правя, когато изграждам libs с 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
Каква версия на XP? 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, но се срива, когато се използва boost log в услугата на Windows. някаква идея? - person Pritesh Acharya; 12.09.2014