error LNK2019:unresolved external symbol *** referenced in function ***的解決方案

無名_四葉草發表於2020-04-04

今天編譯檔案時遇到下列問題,記錄一下:

error LNK2019:unresolved external symbol *** referenced in function ***
錯誤原因:

 1)當標頭檔案中宣告瞭一個函式,但是在相應的原始檔中卻沒有對該函式進行定義,則會出現為“解決的外部符號”(unresolved external symbol )錯誤。

2)當一個函式呼叫了外部的一個庫檔案中的函式,但是在當前project的properties中並沒有將所依賴的(dependent)庫檔案包含進來時,也會出現這種錯誤。

3)當編譯的檔案沒有沒加入工程時,也會出現這種錯誤。

綜上,當一個solution在linking時找不到所涉及到的函式的定義時就會出現“unresolved external symbol ”錯誤。

例如,下面是呼叫MIL的庫檔案mil.lib中的函式時,由於沒有將mil.lib包含進來而導致的連結錯誤。

1>Linking...
1>MDispSelect.obj : error LNK2019: unresolved external symbol _MappFree@4 referenced in function _main
1>MDispSelect.obj : error LNK2019: unresolved external symbol _MsysFree@4 referenced in function _main
1>MDispSelect.obj : error LNK2019: unresolved external symbol _MdispFree@4 referenced in function _main

【1,2解決方案】

1. Project -> ** Properties... -> Configuration Properties -> Linker -> Input -> Additional Dependencies -> mil.lib

另外,在此之前,還需新增MIL庫的相應目錄:Tools -> Options -> Projects and Solutions -> VC++ Directories -> Show Directories for -> 在Include files中新增C:\Program Files\Matrox Imaging\Mil\Include 以及 Tools -> Options -> Projects and Solutions -> VC++ Directories -> Show Directories for -> 在Library files中新增C:\Program Files\Matrox Imaging\Mil\LIB。新增目錄的目的是為了使VC在呼叫相應庫檔案時不必總是使用絕對地址,VC可以通過檔名在所包含的目錄中進行搜尋。這樣,前面的mil.lib就不必使用絕對地址了。

【缺點】可移植性差,如果將原工程中的原始檔和標頭檔案中的內容copy下來重新建立該工程時(例如:在電子書或網路上找到的程式),仍需自己在工程中新增目錄及所需的庫檔案。

2. 在程式前加入#pragma comment(lib, "mil.lib")也可以達到相同的效果。

【優點】避免了方案1所出現的問題。


【3解決方案】

將沒有加入的檔案加入到工程,重新編譯。問題得到解決。


相關文章