所以剛好今天有空,而且也快年底了,就趕快更新一下,底下列出我更新時遇到的問題。
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問題就解決了
沒有留言:
張貼留言