工程結(jié)構(gòu)
包含有靜態(tài)庫
motion.lib 一個UI邏輯的庫
HGErender.lib 使用一個motion的接口實現(xiàn)的HGE渲染器,與motion.lib沒有鏈接和依賴關(guān)系
一個exe靜態(tài)鏈接motion.lib和HGErender.lib
motion中加入了一些flash支持,將flash的包含放到了預(yù)編譯頭文件,這部分頭文件exe是沒有引用的
表現(xiàn)癥狀
exe可以正常運(yùn)行,但是在motion中新添加的flash類實例化后無法看到成員
重編,重新link,清空重編無用
換用vs2005,依然無用,但是報了一個Error: error in OMF type information 錯誤
解決方法
嘗試將flash包含到預(yù)編譯頭的文件放到對外包含中,讓exe也能看到這一部分
問題解決
分析
VS的調(diào)試系統(tǒng)并不是完全開發(fā),因此我們只能從一些表象來分析一些調(diào)試器原理及行為
這個bug的原因就在 作為調(diào)試入口的exe并沒有獲得完全的motion里調(diào)試的信息。如果將motion作為dll加載,理論分析不會出現(xiàn)這種問題。dll將被作為一個單獨(dú)的調(diào)試入口,需要單獨(dú)加載獨(dú)立的pdb。
本例中,靜態(tài)庫中的調(diào)試信息并沒有鏈接到exe,因此看不到成員的任何信息
擴(kuò)展
大多數(shù)的游戲或應(yīng)用程序都是使用靜態(tài)庫來做鏈接,這樣無論是編寫還是代碼安全都有所兼顧。但對于工程模塊之間的互相隔離,C/C++靜態(tài)庫本身的毛病(CRT內(nèi)存分配及靜態(tài),全局變量問題)就變得尤為嚴(yán)重。
而使用動態(tài)鏈接庫的接口方式也是有一部分程序這樣使用的,如果為了安全或者加密,可以將動態(tài)鏈接庫放到自己的包內(nèi),使用從內(nèi)存讀取dll的技術(shù),這樣安全,工程架構(gòu)又清晰