導致「無法解析的外部符號」的可能情況

2021-07-23 18:49:34 字數 1514 閱讀 7883

之前寫**時一直有遇到過這種問題:

無法解析的外部符號"***::***x",該符號在函式"***::***x" 中被引用......

其大部分都是由於

1.只宣告了函式但並沒有實現它。

這種一般都是大意忘記了,第一次編譯就會發現。

另外宣告了靜態變數,沒有初始化它也會導致這樣的情況發生。

2.宣告了函式也定義了函式但其函式引數對不上。

比如專案a中引用了專案b的類,後來修改了專案b中類的成員函式等但a中沒改過,導致編譯的時候出錯。

3.未在被引用的函式或類中加__declspec(dllexport)和__declspec(dllimport)修飾符。

想要讓函式在其他專案中被引用就要在原始檔處加上__declspec(dllexport),在引用處加上_declspec(dllimport);

一般的寫法是

//b專案中:

//一般在stdafx.h中定義prj_b

//在匯出的***h.h中寫入對巨集定義的判斷

#ifdefine prj_b  

#define bdllexpimport __declspec(dllexport)  

#else  

#define bdllexpimport __declspec(dllimport)  

#endif

//然後在類中使用

//比如b.h標頭檔案中

class bdllexpimport b;

於是,在b專案中因為定義了prj_b所以其為匯出模式,而在a專案中因為沒有定義過prj_b所以其為匯入模式;

4.專案中包含類(lib,dll)的設定路徑不正確。

檢查工程中路徑的設定是否有誤。

5.確定需要的庫都正確指定。

一種方式是通過#pragma comment(lib,"../***.lib")方式指定

一種是在工程屬性中設定附加依賴項:

6.編譯模式方式不同 , (比如win32位下編譯和64位下編譯)也有可能造成編譯不過的現象。

7.debug或release的編譯方式。

之前在本地編譯乙個關於sqlite3.c的專案時, 總提醒無法解析的外部符號_readwritebarrier,但伺服器端一直有在編譯,應該不會編不過。msdn上查了一下,應該是要包含標頭檔案,而後發現原檔案中include 這句被人注釋掉了 , 原因是包含這個檔案vs2002環境下會編譯不過。

那伺服器端在不包含該標頭檔案的情況下為什麼能編譯過呢? 原因是伺服器上編譯是release版本的。而本地調整成release版本後也能進行編譯了。

結論是release和debug版本使用的庫可能存在區別,這個請自行確定使用release版本編譯或者重新找乙個debug的庫。

無法解析的外部符號

在使用vs2008除錯程式的過程中,經常會出現無法解析的外部符號問題,可能的原因有很多種,下面這些是我一年來積累的經驗.僅供參考.考慮可能的原因 0 出現無法解析可能是因為lib檔案不正確,比如64位的編譯配置,結果使用的是32位的lib包.1 只寫了類宣告,但還沒有寫實現類,造成呼叫時無法解析 2...

無法解析的外部符號

在使用vs2008除錯程式的過程中,經常會出現無法解析的外部符號問題,可能的原因有很多種,下面這些是我一年來積累的經驗.僅供參考.考慮可能的原因 0 出現無法解析可能是因為lib檔案不正確,比如64位的編譯配置,結果使用的是32位的lib包.1 只寫了類宣告,但還沒有寫實現類,造成呼叫時無法解析 2...

無法解析的外部符號

在類模板類外實現.h和.cpp分來寫的時候 pragma once template class t class person include stdafx.h include person.h template class t person person t age template class ...