2010-02-23 40 views
2

試圖連接一個Win32的EXE項目時,我得到這個錯誤。我已鏈接到包含此方法的代碼的lib中。但仍然得到一個未解決的符號錯誤。解析外部符號,編譯器添加字母「A」到函數名

error LNK2001: unresolved external symbol "public: bool __thiscall SharedJobQueue::AddJobA(class boost::shared_ptr<class domain::Job>)" ([email protected]@@[email protected]@[email protected]@@[email protected]@@Z)

爲什麼它說AddJobA與'A'底。該方法被聲明爲AddJob。

我查看了'dumpbin/symbols'的輸出,它只包含AddJob而不是AddJobA的符號。爲什麼編譯器在函數名的末尾添加'A'?

回答

4

在這裏,我們看到宏的問題。

沒有什麼不對您的代碼本身的問題是與Windows庫。在Win32頭文件中實際上有一個稱爲AddJob的函數,但並不完全...不聲明Addjob函數,而是分別處理非Unicode和Unicode字符串的AddJobA和AddJobW函數。

A在你的函數名的末尾是由於在定義處理Unicode的窗口標題中定義的宏。從本質上講,他們會碰到這樣的:

#ifdef UNICODE 
# define AddJob AddJobW 
#else 
# define AddJob AddJobA 
#endif 

這讓人們只使用AddJob和宏將朝着正確的Unicode /非Unicode功能點的功能。當然問題是#define會影響到所有的東西,這就是你的功能發生了什麼。

爲了解決這個問題,你可以#undef AddJob或簡單地改變你的函數的名稱的東西,是不是一個Win32函數。

+0

是否有一個名稱已被使用宏的win32頭「採取」的名單?所以我可以知道我不應該使用什麼名字。 – 2010-02-23 11:23:31

+0

好問題。我不相信有,但是我再也沒有看過。檢查最簡單的方法是轉到msdn.microsoft.com並搜索要使用的函數的名稱,以查看它是否已處於「使用」狀態。 – 2010-02-23 11:25:41

+0

我不會在這裏說「宏觀是一個問題」。它們在整個低級別的win32 API中以不變的方式使用。 – 2010-02-23 11:31:15

1

Windows函數在函數的末尾可能有AW - A表示ASCII,W表示寬固定大小的unicode。您的項目設置決定使用哪個功能。如果您的項目啓用了unicode,addJob最終可能有W ..

5

MS使用宏作爲Win32 API來支持Unicode和Ansi版本,後綴爲AW
AddJob()是Win32 API中的函數,因此有這樣一個宏 - 你可以#undef AddJob擺脫你的問題。