關於error LNK20xx的連接錯誤

引子

使用VS編譯C++程序常常會遇到這種狀況:編譯已經成功,沒有報錯;可是連接時報錯,相似於:「error LNK2001!@#¥#¥@%#……@#¥%&*&¥%¥@#¥」。網上查到的相關文章和我實際遇到不太同樣,在這裏總結一下我所遇到的連接錯誤的解決方式。注:這裏不明確指明error LNK的錯誤代碼。linux

1、沒有正確的配置XXX.lib

windows編譯用到其餘的dll庫如XXX.dll,不但須要 .h的頭文件,並且須要相應的 XXX.lib文件。以前查過說是這個XXX.lib文件是指明瞭函數的入口地址神馬的,但爲啥linux下就不須要呢? 回到問題自己,沒有正確配置XXX.lib文件有如下幾種可能: a)沒有在連接的附加依賴項中寫入正確的XXX.lib(或者使用#param 在程序中設定); b)搜索庫文件的路徑上XXX.lib不存在(庫文件路徑沒有設置正確); c)XXX.lib文件有多個版本,而庫文件路徑上那個版本與你頭文件的版本不一致;windows

2、C++類的函數在頭文件中聲明瞭,可是在cpp文件中沒有對應的定義。

這種錯誤比較容易發現。錯誤中會出現函數名。編輯器

3、VS的配置不正確

這個是剛發現,而且昨天折磨了我半個下午。 咱們工程的一個solution中包含多個project,並且project之間有依賴關係——某些的project會用到一些基礎project生成的lib。 以前的工程在VS2005上,項目依賴很簡單,只要在項目點右鍵->項目依賴項中勾選被依賴的項目便可。 前幾天新裝電腦,把工程遷移到VS2013上。已有的舊project都沒問題。可是新建項目(也是有項目依賴),老是會報error LNK2001或error LNK2019的連接錯誤。通過仔細對比新舊項目的差異,甚至對.vcxproj文件作diff排查,發如今VS2013中項目依賴要在通用屬性->引用中設置。像VS2005那樣只在項目依賴項中設置是不行的。具體的發現的過程以下:函數

  1. 首先排除了前面總結中第二種產生連接錯誤的可能,連接錯誤確定是項目屬性頁中「鏈接器」項的某些項配置錯了。因而將能夠不報錯的舊項目和新項目點開逐個頁對比。在「命令行」選項卡中發現差異: /DYNAMICBASE 項的參數中無連接錯誤的項目比有錯誤的多了幾行,下圖劃紅線的部分: 命令行差異 而畫紅線的部分正是項目所依賴project生成的lib。命令行

  2. 對.vcxproj文件作diff 正常連接的項目多瞭如下的配置:code

    <!-- lang: xml -->xml

    <ProjectReference Include="..\ENOService\ENOService.vcxproj">
         <Project>{050ad614-2864-4ca2-b878-e16d2b07ed33}</Project>
         <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
       </ProjectReference>
       <ProjectReference Include="..\ENOUtils\ENOUtils.vcxproj">
         <Project>{aa57406b-6277-443e-ba0b-8e782ee7ec07}</Project>
         <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
       </ProjectReference>

而「ProjectReference Include」部分正是項目所依賴的project。io

  1. 從上面的兩點能夠看出是項目依賴出了問題 可是項目依賴項已經配置了啊。問題在哪裏呢?偶然間手賤,點開了正常連接項目的屬性卡中第一項「通用屬性」->「引用」: 項目引用

而連接錯誤的項目中這一項是空白的。點擊「添加新引用」對其進行設置,問題解決! 並且在這裏引用了其餘項目後,項目右鍵的「項目依賴項」中的選項是刪不掉的。編譯

  1. 總結 a)問題本質上來說是沒有正確配置lib——沒有找到lib文件。 b)VS2005到VS2013有不少變化,但這個原本在2005中不要配置的項在2013中卻要配置了算是被MS坑了?也能夠說是我沒跟上MS的步伐,out了~ c)IDE VS 純文本。IDE在背後幫咱們作了不少事。可是咱們不瞭解(我本身水平差,理解不深)。而若是在linux下使用本身寫Makefile可已很清楚知道工程全部編譯的配置項。甚至當我使用文本編輯器打開了VS的.vcxproj文件,對其中的配置也是一目瞭然。如今我是愈來愈傾向於純文本。IDE在隨着版本的變化,哪裏修改想要的配置?只能呵呵了。
相關文章
相關標籤/搜索