最近開發(fā)中遇到loadlibrary失敗的問題,困擾了很久,最近終于解決了,做個筆記同時也希望遇到此類問題的人多一種嘗試的途徑。
正題:在c++的開發(fā)中,需要加載java虛擬機(jī)(jvm.dll),我用的是loadlibrary,一直也是相安無事。直到遇到在一臺機(jī)器程序崩潰,問題才暴露出來;我的應(yīng)用程序是64位的,jvm.dll也是64位的(depends查看),所以不是64位程序加載32位dll的問題。
最主要的是在vs的編譯環(huán)境下(無論debug還是release)是可以正常運(yùn)行的,用批處理文件(.bat)則崩潰。于是嘗試使用loadlibraryEx()來加載jvm.dll,結(jié)果是一樣的.bat文件啟動程序失敗。
在一次逛微軟的網(wǎng)站時,我突然意識到可能是缺少了系統(tǒng)文件,結(jié)果證明我的猜測是對的。程序無法運(yùn)行的機(jī)器上沒有msvcr100.dll, (其他vs2010相關(guān)的動態(tài)庫都不存在,可以通過安裝vs2010解決),在將msvcr100.dll拷貝過來之后,程序正常運(yùn)行了。問題解決。
ps: 我們編寫的程序最好不要依賴系統(tǒng)文件,(網(wǎng)上有很多游戲無法運(yùn)行的問題就是依賴了系統(tǒng)文件),所以可以將所缺少的文件拷貝到自己的工程中,這時要使用loadlibraryEx(),這是因為兩個加載函數(shù)的搜索路徑是不一樣的。loadlibraryEx()可以指定搜索路徑,具體參數(shù)設(shè)置網(wǎng)上資料很多。
接下來會利用周末時間更新自己對effective c++的理解,借以加深理解
新聞熱點
疑難解答