0x00 現象及原因
舉例: warning LNK4099: PDB 'wxbase30ud.pdb' was not found with 'wxbase30ud.lib(any.obj)'
使用VC時鏈接了三方靜態庫, 並且三方靜態庫(一般是開源的三方庫)是在一個solution下的多個project, 當然, 網上基本都是這么回答的, 其實本質原因是因為這些開源庫一般都會通過各種方式修改solution和project的默認路徑把二進制生成到同一個目錄下, 比如lib, 而我們自己平時簡單的靜態庫工程是不怎么修改默認工程配置的.
由於每個開源庫的作者有自己的工程組織方式, 但導致LNK4099的最終原因無非是PDB路徑問題
0x01 解決方案
a. 如果確認不需要PDB, 即不需要調試開源庫, 完全可以在設置里將/Zi或/ZI去掉, 這樣即能消除warning也能提升開源庫編譯速度
b. 如果需要調試開源庫, 方法也不復雜
b.1. 將開源庫project里的C/C++->General->Debug Information Format 設置為Zi或ZI(兩者區別請自行google, Zi就夠用了, 只是高版本的VS默認都是ZI)
b.2. 然后在C/C++->Output Files->Pragram Database File Name 設置為$(OutDir)$(TargetName).pdb, (有些2B開源庫這里設置的跟VS默認的是一樣的比如$(IntDir)vc$(PlatformToolsetVersion).pdb, 但把IntDir改成了同一個目錄, 每個project生成出來的pdb名字路徑都是一致的, 當然就會出問題), 這里需要注意的是, 一定要確保$(OutDir)$(TargetName)是有意義的, 個別開源庫完全不用vs自帶的宏, 甚至個別開源庫需要configure之后才生產vc project, 甚至是絕對路徑, 但你所要確保的是, 目錄必須跟生成的.lib是同一個, 文件名(不包括擴展名)必須是和生成的xxx.lib的xxx是一致的. 之后你要做的就是把每個project的debug&release都按照如上改好再編譯就ok了
0x02 總結
其實這個問題完全不是編譯器或VS的事(這也說明了即使你disable 4099 waning依然還會報, 因為壓根跟編譯沒關系), 就是路徑錯了, 改對就ok了.
網上絕大多數回答要不然就是跑題告訴你如何如何屏蔽不顯示這個warning, 要不就是讓你把obj目錄拷過去(這個沒用)等等, 都沒鳥用
希望能有所幫助