2008-08-08 126 views
6

我打開了一箇舊的工作區,它是一個libray及其測試工具。它過去工作得很好,但現在沒有,老版本的代碼也不能使用相同的錯誤。我嘗試重新創建項目,並導致相同的錯誤。在項目設置中沒有任何東西出現亂碼,並且生成的代碼在主應用程序中可用。鏈接問題(VC6)

我已經剝去了大部分文件,並把它歸結爲最低限度生成錯誤。不幸的是,我不能發佈項目,因爲這是用於生產代碼。

LNK2001鏈接器錯誤我通常意味着我已經離開了一個庫或忘記實現一個虛擬功能。然而,這是標準模板庫的一部分,並且是一個標題。

被列爲具有IOCompletionPort.obj問題實際上不直接使用std::string,但並調用的類,它的代碼:Comms::Exception接受std::stringGetLastErrorWSAGetLastError值。

錯誤(GetMessage)中提到的函數是實現的,但它是一個虛函數,所以其他類可以在需要時覆蓋它。然而,它似乎是編譯器使它成爲一個Ansi版本,但我無法找到設置中的任何選項來控制它。我懷疑這可能是問題,但由於圖書館的選擇方式很少,我無法確定。但是這兩個項目在編譯器選項中指定_MBCS。

--------------------配置:TestComms - Win32 Debug ------------------ - 鏈接... Comms.lib(IOCompletionPort.obj) :錯誤LNK2001:無法解析的外部符號「公共:虛擬類 std :: basic_string,類 std :: allocator> __thiscall Comms :: Exception :: GetMessageA void?const「(?GetMessageA @ Exception @ Comms @@ UBE?AV?$ basic_string @ DU?$ char_traits @ D @ std @@ V?$ allocator @ D @ 2 @@ std @@ XZ) Debug/TestComms .exe:致命錯誤LNK1120:1個未解析的外部程序 執行link.exe時出錯。

TestComms.exe - 2個錯誤,0個警告

有什麼建議?我已經失去了大部分的時間,也不想在下午的大部分時間裏失去。

回答

4

一個可能性在於Win32 ANSI/Unicode「name-mangling」,它將符號GetMessage變成GetMessageAGetMessageW。有三種可能性:

  1. WINDOWS.H尚未加載,所以GetMessage保持GetMessage

  2. WINDOWS.H加載與ANSI符號集,所以GetMessage成爲GetMessageA

  3. Windows.h中加載了爲Unicode設置的符號,因此GetMessage變爲GetMessageW

如果您已經以觸發兩種不同方案的方式編譯了兩個不同的文件,則會出現鏈接器錯誤。該錯誤消息表明Comms::Exception類是上述#2的一個實例 - 可能是在某個地方使用了windows.h尚未加載的地方?

其他的事情我會替你做,只是作爲日常的問題:

1)確保了我和庫路徑不包含任何我不期待。

2)做一個「建立乾淨」,然後手動驗證它,刪除任何額外的對象文件,如果有必要。

3)確保包含語句中沒有任何硬編碼路徑,這並不意味着它們在最初重建項目時意味着什麼。

編輯:與格式:(

0

WINDOWS.H在IOCompletionPort.h的頂部,宣佈戰鬥的包括 - 我生病看到7個系只是包括1個文件,所以我已經把它包了自己的文件,包括本身。這也包含了一些額外的#define(即ULONG_PTR)作爲我們的主要的應用程序將不會安裝:-(

  1. 即證實了這一平臺SDK編譯。沒有什麼是不適當的。
  2. 我這樣做了 - 刪除了構建目錄
  3. 我從不使用硬編碼路徑。
0

假設你有沒有與項目設置刪除的東西,你不應該有(這是我所期待的外部依賴像USER32.LIB是)左右futzed:

檢查工具|選項|目錄|圖書館(從這裏回憶),並確保你不會錯過常見的所有花園品種lib目錄(再次,沒有VC6在我面前,我不能告訴你它們是什麼)

1

@Curt :我想你是最接近的。我沒有測試過這個,但我想我有點在我原來的問題中給出了答案。

GetMessage是在Windows.h中定義的,封裝在ifndef塊中以在Ansi(GetMessageA)和Unicode(GetMessageW)之間切換。

0

這是Microsoft處理ANSI與Uni​​code API的方式的一個普遍問題。由於它們都是通過爲解析爲函數名稱的'A'或'W'版本的函數名稱定義宏來完成的(或幾乎全部),所以不能在您的名稱空間/ class/struct/enum /函數匹配Windows API名稱。

windows.h宏對所有其他名稱空間運行粗糙。