[英]What is Compatible “int” type in both 32Bit & 64Bit windows in C++?
[英]C++ windows code links in 64bit but not in 32bit
我在Windows上用C ++編寫了代碼。 當我將其編譯為x64時,我的代碼進行編譯和鏈接,但是當我將構建配置更改為x86時,則不是。
失敗是鏈接錯誤。
我正在使用來自ntdll的函數RtlIsNameInExpression。
當我以32位模式進行編譯時,出現未解決的外部鏈接錯誤(LNK2019)。
任何想法為什么會發生這種情況?
10倍
首先-如何聲明函數以及找不到鏈接器的哪個符號?
聲明必須是
extern "C" NTSYSAPI BOOLEAN NTAPI RtlIsNameInExpression(
_In_ PCUNICODE_STRING Expression,
_In_ PCUNICODE_STRING Name,
_In_ BOOLEAN IgnoreCase,
_In_opt_ PWCH UpcaseTable
);
我可以猜測,如果您從此處復制粘貼,您會錯過NTAPI
即__stdacall
關鍵字。 對於x64,僅存在一個調用約定,但是對於x86,例如__stdcall
和__cdecl
之間存在區別。 這可以解釋為什么在x64
找到但在x86
找不到
什么錯誤給您的鏈接程序(不是編譯器!)? 未解析的外部符號__imp__RtlIsNameInExpression
嗎? (如果是,您真的忘記了__stdcall
集)或__imp__RtlIsNameInExpression@16
嗎? 在這種情況下,您聲明函數正確,但您的ntdll.lib
不包含此符號。 (可能是您將舊的ntdll.lib
用於xp嗎?)只需像在ntdll[p].lib
一樣搜索__imp__RtlIsNameInExpression@16
字符串-是否找到了? 如果沒有,我想你有舊的(xp)版本的ntdll。
答案在該功能的在線文檔中:
該函數沒有關聯的頭文件。 關聯的導入庫Ntdll.lib在Microsoft Windows驅動程序工具包(WDK)中可用。 您還可以使用LoadLibrary和GetProcAddress函數調用此函數,以動態鏈接到Ntdll.dll。
如果無法將WDK中的ntdll.lib文件添加到鏈接命令中,則需要使用LoadLibrary-GetProcAddress方法。
同樣在文檔的同一部分:
Winternl.h中的功能和結構是操作系統的內部組件,可能會從一個Windows版本更改為另一個Windows版本,甚至可能在每個版本的Service Pack之間更改。 為了保持應用程序的兼容性,您應該使用等效的公共函數。 有關更多信息,請參見頭文件Winternl.h和每個功能的文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.