使用VS編譯C++程序常常會遇到這種狀況:編譯已經成功,沒有報錯;可是連接時報錯,相似於:「error LNK2001!@#¥#¥@%#……@#¥%&*&¥%¥@#¥」。網上查到的相關文章和我實際遇到不太同樣,在這裏總結一下我所遇到的連接錯誤的解決方式。注:這裏不明確指明error LNK的錯誤代碼。linux
windows編譯用到其餘的dll庫如XXX.dll,不但須要 .h的頭文件,並且須要相應的 XXX.lib文件。以前查過說是這個XXX.lib文件是指明瞭函數的入口地址神馬的,但爲啥linux下就不須要呢? 回到問題自己,沒有正確配置XXX.lib文件有如下幾種可能: a)沒有在連接的附加依賴項中寫入正確的XXX.lib(或者使用#param 在程序中設定); b)搜索庫文件的路徑上XXX.lib不存在(庫文件路徑沒有設置正確); c)XXX.lib文件有多個版本,而庫文件路徑上那個版本與你頭文件的版本不一致;windows
這種錯誤比較容易發現。錯誤中會出現函數名。編輯器
這個是剛發現,而且昨天折磨了我半個下午。 咱們工程的一個solution中包含多個project,並且project之間有依賴關係——某些的project會用到一些基礎project生成的lib。 以前的工程在VS2005上,項目依賴很簡單,只要在項目點右鍵->項目依賴項中勾選被依賴的項目便可。 前幾天新裝電腦,把工程遷移到VS2013上。已有的舊project都沒問題。可是新建項目(也是有項目依賴),老是會報error LNK2001或error LNK2019的連接錯誤。通過仔細對比新舊項目的差異,甚至對.vcxproj文件作diff排查,發如今VS2013中項目依賴要在通用屬性->引用中設置。像VS2005那樣只在項目依賴項中設置是不行的。具體的發現的過程以下:函數
首先排除了前面總結中第二種產生連接錯誤的可能,連接錯誤確定是項目屬性頁中「鏈接器」項的某些項配置錯了。因而將能夠不報錯的舊項目和新項目點開逐個頁對比。在「命令行」選項卡中發現差異: /DYNAMICBASE 項的參數中無連接錯誤的項目比有錯誤的多了幾行,下圖劃紅線的部分: 而畫紅線的部分正是項目所依賴project生成的lib。命令行
對.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
而連接錯誤的項目中這一項是空白的。點擊「添加新引用」對其進行設置,問題解決! 並且在這裏引用了其餘項目後,項目右鍵的「項目依賴項」中的選項是刪不掉的。編譯