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