1. 程式人生 > >VS2013的LINK2005問題解決方案(僅限由第三方庫造成的問題)+ 附LNK2038

VS2013的LINK2005問題解決方案(僅限由第三方庫造成的問題)+ 附LNK2038

最近蕩的別人的程式碼做大作業,結果各種問題層出不窮,非常鬱悶,本想著泡泡通過直接上交,卻沒想到陷入無解狀態,好在查了各種部落格之後,終於找到了解決方案,現記錄如下。(由於小白一枚,用語不嚴謹,以理解問題、解決問題為第一要義,請見諒)

-------------------------------------------------分割線

一.問題說明

通常我們在編寫程式時,或多或少都會用到第三方庫,甚至不止一個第三方庫,這時就會存在一個程式碼相容問題(庫與庫之間,庫與我們的工程之間)。

在“屬性->C/C++->程式碼生成”的執行庫選項下我們可以看到有多種模式,這些模式決定了生成的程式碼在執行時所採用的方式(或者說使用的執行庫)不同的第三方庫(.lib檔案)在使用cmake+VS方式(其他方式不瞭解,理論上應該一樣)生成時,也有該屬性,因此相當於在你生成相應的第三方庫的.lib檔案等檔案時,就已經確定了相應庫檔案的執行庫,因此你在呼叫第三方庫執行程式碼時,如果使用的執行庫與第三方庫不一樣,就可能導致重定義問題,因為由於工程中存在多重執行庫,因此就會編譯多個執行庫,而在不同的執行庫中,有很多的定義是一樣的,因此就會導致重定義的問題.SO,BINGO,問題就這樣發生了,伴隨著幾十上百的錯誤,讓人絕望!

二.解決方案

問題弄明白了,就輪到解決方案了!

1.簡單粗暴

在”屬性->連結器->命令列“中新增:/FORCE:MULTIPLE,相信大家看懂了什麼意識,就是強迫採用多執行緒的編譯方式。通常這樣一般就可以解決問題了,但問題在於,多執行緒也有多種方式,因此就又產生下面的終極解決方案。(兩者可以一起使用,多重保險更放心,建議先嚐試一,再加上二)

2.從根本上解決問題

既然已經知道是生成相應的第三方庫使用執行庫不一致產生的問題,那就直接在“屬性->C/C++->程式碼生成”中將執行庫修改成一樣後重新生成再使用,然後自己的工程檔案也使用一樣的執行庫就OK了

三.話外餘音

2.有時,導致LNK2005的原因與執行庫無關,這時有種解決方案是直接確定各種庫的連結先後順序,然後強制連結器按照正確的順序連結相應的庫,具體操作請自行stackflow,暫未遇到,無心查閱,等碰到了在給出具體方案。