2011-01-25 61 views
2

我正在鏈接ntdll.lib以使用ZwQueryInformationProcess,並使用多線程運行時庫。錯誤LNK2005:已在ntdll.lib(ntdll.dll)中定義_sprintf

ntdll似乎定義了一些crt函數。所以,當我連接它並使用運行時庫時,我得到鏈接器錯誤。

我可以強制鏈接器使用crt函數並忽略ntdll符號以擺脫錯誤嗎?或者以別的方式解決這個錯誤。

我知道ZwQueryInformationProcess的文檔建議動態加載,但它在靜態庫中使用我的主項目也鏈接到,並且這一直工作很長時間,所以我不想改變它。

謝謝。

我在其他網站上發現了一些關於此問題的討論,例如:http://www.codeguru.com/forum/archive/index.php/t-414274.html,但沒有看到任何似乎提供了良好解決方案的內容。有一些提到更改鏈接順序,但我看不到如何通過項目設置更改運行時庫鏈接的順序。

+0

你從哪裏得到ntdll.lib? ntdll.dll會導出sprintf,但不包含前導下劃線。這不應該導致_sprintf的鏈接器錯誤。 – 2011-01-25 15:08:23

+0

我連接到C:\ WINDDK \ 7600.16385.0 \ lib \ wxp \ i386 \ ntdll.lib,我意識到在該DDK中有更高版本的lib,但我的程序需要在xp上運行。我檢查過,這個有_sprintf,但是我見過的其他ntdll.lib不會導出它。 – 2011-01-25 15:26:48

回答

2

更改鏈接順序似乎解決了它。要更改自動鏈接庫的順序,您需要通過添加到「忽略特定庫」來忽略它們,然後按照您希望它們鏈接的順序將它們重新添加到「附加相關性」中。該錯誤信息是這樣的:

1>libcmt.lib(wcstol.obj) : error LNK2005: _wcstoul already defined in ntdll.lib(ntdll.dll) 

所以,我說LIBCMT.LIB如忽略了,也把它的附加依賴的開始。這產生了另一個錯誤,我遵循相同的步驟。因此,項目屬性最終看上去像這樣(ntdll.lib是在附加依賴結束):

Project properties screenshot

我還發現添加功能/ verbose:lib添加到鏈接器 - >命令行 - >其他選項是有用的,以便您可以確切地看到哪些庫鏈接和以什麼順序。

相關問題