奇怪的鏈接錯(cuò)誤
緣起
一般情況下鏈接錯(cuò)誤很好解決,最常見的是重定義和找不到外部符號,不過這次遇到的鏈接錯(cuò)誤有些奇怪,一起來看看吧。
初遇錯(cuò)誤
寫完代碼,開開心心的編譯,沒想到遇到下面的鏈接錯(cuò)誤。

不慌,這種錯(cuò)誤見的太多了,見怪不怪了。終極原因是:鏈接的時(shí)候找不到合適的庫。大概率是庫路徑設(shè)置不對,或者沒引用這個(gè) lib。因?yàn)榇a中明確使用 #pragma comment(lib, lib_path) 引用了庫,所以問題大概率出在庫路徑上。

在檢查工程設(shè)置前,先介紹下兩個(gè)工程的輸出目錄,也就是 $(OutDir) 的值。
TestLinkErrorExe 工程的 OutDir 如下圖所示:

TestLinkErrorDll 工程的 OutDir 如下圖所示:

都指向了 $(SolutionDir)bin\$(Platform)\$(Configuration)\。$(SolutionDir) 指的是 .sln 文件所在的路徑,這里是 E:\working\MyTestProjects\TestLinkError\,因?yàn)榫幾g的是 64 位 Debug 版本,所以 $(Platform) 的值是 x64。$(Configuration) 的值是 Debug。所以,最終的路徑是:E:\working\MyTestProjects\TestLinkError\bin\x64\Debug\。
有了這個(gè)背景介紹,就可以接著查看工程設(shè)置了。
檢查工程設(shè)置
因?yàn)?TestLinkErrorDll.lib 是 TestLinkErrorDll 工程產(chǎn)生的,需要保證 TestLinkErrorDll 先編譯,如果先編譯 TestLinkErrorExe 的話,鏈接的時(shí)候,TestLinkErrorDll 還沒編譯,TestLinkErrorDll.lib 也就不會(huì)產(chǎn)生,自然會(huì)找不到。所以,需要設(shè)置編譯順序,最簡單的實(shí)現(xiàn)方式就是設(shè)置工程依賴。
在 Solution 上 右鍵 -> Project Dependencies... ?打開 Project Dependencies 設(shè)置界面,如下圖:

經(jīng)檢查,工程依賴已經(jīng)設(shè)置正確了。
檢查完工程依賴,再檢查庫目錄( Library Directories)。有兩個(gè)地方需要檢查:


經(jīng)檢查,這兩處設(shè)置確實(shí)是正確的。納尼?所有設(shè)置都正確!為什么結(jié)果不正確呢?直接打開 .vcxproj 文件查看里面的 OutDir 的值,如下圖:

從圖中可知, 在 的下方。果斷調(diào)整順序,再次編譯,一切順利。
反思
再次打開有問題的工程,查看 OutDir 屬性的值,是錯(cuò)誤的路徑!如下圖:

總結(jié)
鏈接錯(cuò)誤不可怕,耐心細(xì)致的查看工程設(shè)置,基本上都能解決掉。
感謝你的分享,點(diǎn)贊和在看
