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