2010年12月10日 星期五

boost 1.38更新到1.45 記錄

今天更新了工作用的boost 1.38,之前也是一直想更新,可是都沒空閒,或是怎麼一更新complier就一堆錯誤。
所以剛好今天有空,而且也快年底了,就趕快更新一下,底下列出我更新時遇到的問題。

1. exception header file改變

#include <boost/exception.hpp>

改為

#include <boost/exception/all.hpp>


心得: 不知道這樣改的原因是為什麼,原本不是好好的嗎

2. boost::exception的 get_error_info介面改變

我自己做的logger library會手動去讀取boost::exception的error info
原本是像底下這樣

boost::shared_ptr<char const * const> f = boost::get_error_info<boost::throw_file>(ex)

改成

const boost::throw_file::value_type* f = boost::get_error_info<boost::throw_file>(ex)


3. binary archive bug

之前的boost 1.38版本的binary_iarchive是version 5的,現在到boost 1.45該class也更新到version 8
更新是沒什麼關係,只要有相容舊版的就好,悲劇的就是他不相容... T____T
想一想,這種大型又多人使用的library,在檔案處理上不相容舊版,怎麼想都沒道理啊
於是我就去trace底層的程式碼,並且和boost 1.38版的程式對照,終於讓我發現bug了


開啟boost/archive/basic_binary_iarchive.hpp並找到

void load_override(version_type & t, int version){
library_version_type lvt = this->get_library_version();
if(boost::archive::library_version_type(7) < lvt){
this->detail_common_iarchive::load_override(t, version);
}
else
if(boost::archive::library_version_type(6) < lvt){
uint_least16_t x=0;
* this->This() >> x;
t = boost::archive::version_type(x);
}
else{
unsigned int x=0;
* this->This() >> x;
t = boost::archive::version_type(x);
}
}

可以發現到,若目前lvt是5的話會執行else那段程序,x 的宣告是unsigned int

我們再看一下boost 1.38的該段程式碼

void load_override(version_type & t, int){
// upto 255 versions
unsigned char x=0;
* this->This() >> x;
t = version_type(x);
}

Oops!!! 同樣是x,可是size不一樣...

有問題的還包括 void load_override(class_id_type & t, int version) 這個function
不知道boost 的issue tracking有沒有登錄這個bug了

4. boost::thread + MFC DLL 問題

基本上這個問題在boost 1.38就有了,但是原因有點年代久遠我也忘光光了... 囧
只是沒想到更新成boost 1.45後問題還是沒有解決...

如果你是使用MFC開發程式 ,又剛好你建立的MFC DLL檔有使用boost::thread,就會發生compile正常但是一執行程式出現ASSERT。

解決方法就是到boost/libs/thread/src/win32/tss_pe.cpp裡
把底下的程式碼註解掉
extern BOOL (WINAPI * const _pRawDllMain)(HANDLE, DWORD, LPVOID)=&dll_callback;

再重新compile boost問題就解決了









LinkWithin

Related Posts with Thumbnails