之前寫**時一直有遇到過這種問題:
無法解析的外部符號"***::***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 ...