我用visual studio 2010 c++編的控制臺程式,呼叫了一個第三方元件gmsh。發布方提供了h,lib和dll檔案,只有一個版本,未區分debug/release(后來用depend軟體查看過dll,應該是release版)。
采用靜態匯入的方式呼叫了這個庫,在debug方式下運行正常。但是編譯成release后運行報錯,dll檔案均放在對應的exe路徑下。
錯誤為:無法定位序數1271于元件……xx.exe上
用depend查看了release版exe檔案如下,確實發現呼叫的序數和dll內函式無法對應

另外,在MFC100.dll這里也出現了序數1272

再用depend查看了debug版exe檔案如下,似乎沒有上面的問題

請問這個問題如何解決?謝謝。
uj5u.com熱心網友回復:
補充一下:關于這個庫的呼叫,一開始時編譯是通不過的,顯示大量LNK2005重定義錯誤。搜了下,發現原因很可能是主程式的CRT版本和第三方庫的CRT版本不一致導致。解決辦法是在聯結器的命令列中添加了“/FORCE:MULTIPLE”指令,于是大量的error轉為了warning,編譯通過了。debug版的程式也可以正確運行了。但目前release版又出現了上面描述的問題。
不知道這兩個問題是否有關聯
uj5u.com熱心網友回復:
最好是保證exe,dll的運行時庫都是一致的,debug,release也都對應好uj5u.com熱心網友回復:
第三方庫并未提供debug版本和release版本,只有一個版本。通過depend查看第三方dll呼叫的msvcrt等dll,發現檔案名沒有“D”的后綴,推測是release版本。
uj5u.com熱心網友回復:
問題初步得到了解決,但機理不明,還請明白的大佬指點我搜到一個關于呼叫ffmpeg庫中遇到的類似問題
https://blog.csdn.net/machh/article/details/51443361
解決辦法是:
vs2010
release 專案屬性中-----》連接器----》優化 選項中選擇:保留未參考資料
linker-----optimization ----reference--- No (/OPT:NOREF)
這樣修改后release編譯無法通過,出現了如下型別錯誤
LNK1179: 無效或損壞的檔案: 重復的 COMDAT“?XXX@XXXX”
進一步搜到了帖子
https://www.cnblogs.com/QQ278737076/p/5458592.html
解決辦法是:
解決方法:專案右擊【屬性】 - 【C/C++】 - 【優化】 - 【全程式優化改成】 “否”
release編譯通過,正常運行。但我完全不理解這個問題出現的機制是什么,以及我這么修改解決后,是否帶來了什么弊端?
uj5u.com熱心網友回復:
應該是DLL依賴的庫版本和開發環境的不一致, VS2010的補丁安裝了沒?uj5u.com熱心網友回復:
這是典型的庫沒有對應上。 庫的名字對應上了,但是庫的內容和庫的版本與頭檔案沒有對應上,或是庫本身內部有錯誤,都會造成這樣的事。uj5u.com熱心網友回復:
沒有,請問需要安裝什么補丁?
uj5u.com熱心網友回復:
明明報的是在exe里找不到函式,你去看DLL的匯出表做什么?有這個錯誤說明函式的宣告錯了,該用__declspec(dllimport)地方的卻用了__declspec(export) (這也會造成LNK2005錯誤)。至于到底哪個函式錯了把你加的那些亂七八糟的編譯引數拿掉,再編譯一次然后去看編譯器報什么錯。一般DLL頭檔案都有#ifdef的,在exe里包含頭檔案的時候應該讓ifdef解釋成__declspec(dllimport)(具體怎么干得看頭檔案里怎么#ifdef的),在DLL編譯自己的時候才用__declspec(export)。
編譯器就發現的bug,加/Force給編譯器消音搞成了一個運行時bug……
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/46940.html
標籤:進程/線程/DLL
