一、是什麼?
在編譯程序時,出現了「unresolved externals」錯誤,這是什麼意思呢?簡單來說,這個錯誤是指程序在編譯時找不到一些在程序中被引用但並未在當前文件或庫中找到的函數或變量。這些函數或變量通常位於外部文件或庫中。
這個錯誤通常會在鏈接階段發生。在鏈接階段,編譯器會將所有的目標文件和庫鏈接在一起,以創建最終的可執行文件。在這個過程中,編譯器會檢查所有的符號,例如函數或變量,以確保它們都能夠被正確地解析。
然而,如果遇到了未能解析的函數或變量,編譯器就會報告一個「unresolved externals」錯誤。
二、為什麼會出現unresolved externals?
那麼為什麼會出現這個錯誤呢?通常有以下幾個原因:
1.函數或變量未定義
如果在程序中引用了一個函數或變量,但是這個函數或變量在任何庫中都沒有被定義,那麼編譯器就無法找到它們,從而導致「unresolved externals」錯誤。
2.鏈接庫未正確鏈接
如果程序依賴於某些外部庫,但是這些庫未能正確鏈接,編譯器就無法找到程序中需要的符號,導致「unresolved externals」錯誤。
3.函數或變量名稱錯誤
如果在程序中引用了一個函數或變量,但是在程序中使用的名稱與定義時使用的名稱不一致,編譯器就會找不到這個符號,導致「unresolved externals」錯誤。
4.編譯器的鏈接順序不正確
如果程序中的多個目標文件包含相同的全局變量或函數,但是編譯器將它們的鏈接順序安排不當,就會導致「unresolved externals」錯誤。
三、如何解決unresolved externals?
為了解決「unresolved externals」錯誤,我們可以採取以下幾步:
1.檢查函數或變量是否被正確定義
如果程序中引用了一個函數或變量,但是這個函數或變量在任何庫中都沒有被定義,那麼編譯器就會找不到這個符號,從而導致「unresolved externals」錯誤。因此,我們需要檢查這個函數或變量是否被正確定義。
//示例代碼 #include using namespace std; //函數未定義 void foo(); int main() { foo(); return 0; }
上述代碼中的函數foo()在程序中被引用,但是並沒有被定義,因此編譯器就會報告「unresolved externals」錯誤。為了解決這個問題,我們需要在程序的某個地方定義這個函數:
//示例代碼 #include using namespace std; //函數已定義 void foo() { cout<<"Hello world!"<<endl; } int main() { foo(); return 0; }
2.檢查庫是否正確鏈接
如果程序依賴於某些外部庫,但是這些庫未能正確鏈接,編譯器就會無法找到程序中需要的符號,導致「unresolved externals」錯誤。為了解決這個問題,我們需要檢查庫是否正確鏈接。
//示例代碼 #include #include int main() { double result=sqrt(4.0); std::cout<<"The result is "<<result<<std::endl; return 0; }
上述代碼中使用了math.h頭文件中的sqrt()函數,如果編譯器無法找到這個函數,就會報告「unresolved externals」錯誤。為了解決這個問題,我們需要在編譯器的鏈接選項中添加對math庫的鏈接:
//示例代碼 gcc main.cpp -lm
3.檢查函數或變量名稱是否正確
如果在程序中引用了一個函數或變量,但是在程序中使用的名稱與定義時使用的名稱不一致,編譯器就會找不到這個符號,導致「unresolved externals」錯誤。為了解決這個問題,我們需要檢查函數或變量名稱是否正確。
//示例代碼 #include //定義變量 int my_var=10; int main() { //使用未定義的變量名 std::cout<<myvar<<std::endl; return 0; }
上述代碼中輸出變量myvar,但實際上程序中定義的變量名是my_var,這就會導致編譯器找不到這個符號,報告「unresolved externals」錯誤。為了解決這個問題,我們需要使用正確的變量名:
//示例代碼 #include //定義變量 int my_var=10; int main() { //使用正確的變量名 std::cout<<my_var<<std::endl; return 0; }
4.調整編譯器的鏈接順序
如果程序中的多個目標文件包含相同的全局變量或函數,但是編譯器將它們的鏈接順序安排不當,就會導致「unresolved externals」錯誤。為了解決這個問題,我們可以試着調整編譯器的鏈接順序。
//示例代碼 //test1.cpp #include //定義全局變量 int global_var=10; //test2.cpp #include //引用全局變量 extern int global_var; int main() { std::cout<<"The global variable is "<<global_var<<std::endl; return 0; }
上述代碼中,目標文件test1.cpp中定義了一個全局變量global_var,目標文件test2.cpp中引用了這個全局變量。如果編譯時順序不正確,就會導致編譯器無法正確解析global_var符號,報告「unresolved externals」錯誤。為了解決這個問題,在編譯時需要將test1.cpp放在test2.cpp之前:
//示例代碼 gcc test1.cpp test2.cpp
四、總結
「unresolved externals」錯誤是編譯程序時常遇到的一個錯誤。由於該錯誤來源於程序中某些符號找不到,解決該錯誤通常需要檢查函數或變量是否被正確定義、檢查庫是否正確鏈接、檢查函數或變量名稱是否正確,以及調整編譯器的鏈接順序。在編寫程序時,我們應該盡量避免出現這個錯誤,以提高程序的可維護性和穩定性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/253890.html