我在Windows上用C ++编写代码。 当我将其编译为x64时,我的代码会编译和链接,但是当我将构建配置更改为x86时,我的代码就不会编译。
失败是链接错误。
我正在使用来自ntdll的函数RtlIsNameInExpression。
当我在32位模式下编译它时,我得到一个未解析的外部链接错误(LNK2019)。
为什么会出现这种情况的任何想法?
10倍
答案 0 :(得分:3)
首先 - 如何声明函数以及哪个符号找不到链接器?
声明必须是
extern "C" NTSYSAPI BOOLEAN NTAPI RtlIsNameInExpression(
_In_ PCUNICODE_STRING Expression,
_In_ PCUNICODE_STRING Name,
_In_ BOOLEAN IgnoreCase,
_In_opt_ PWCH UpcaseTable
);
如果您从here进行复制粘贴,我猜您错过NTAPI
即__stdacall
个关键字。 for x64只存在一个调用约定,但对于x86,例如__stdcall
和__cdecl
之间存在差异。这可以解释为什么在x64
中找到但在x86
什么错误给你链接器(不是编译器!)?未解决的外部符号__imp__RtlIsNameInExpression
? (如果是,你真的忘了__stdcall
设置)或__imp__RtlIsNameInExpression@16
?在这种情况下,您声明函数是正确的,但您的ntdll.lib
不包含此符号。 (可能你使用旧的ntdll.lib
对于XP? )只需在__imp__RtlIsNameInExpression@16
中搜索ntdll[p].lib
字符串 - 是否找到了?如果没有,我猜你有旧的(xp)版本的ntdll。
答案 1 :(得分:0)
答案在于该职能的在线documentation:
此函数没有关联的头文件。 Microsoft Windows驱动程序工具包(WDK)中提供了相关的导入库Ntdll.lib。您还可以使用LoadLibrary和GetProcAddress函数调用此函数以动态链接到Ntdll.dll。
如果您无法将WDK中的ntdll.lib文件添加到链接命令,则需要使用LoadLibrary-GetProcAddress方法。
同样来自文档的同一部分:
Winternl.h中的函数和结构是操作系统的内部函数,可能会从一个Windows版本更改为另一个版本,甚至可能在每个版本的Service Pack之间。要保持应用程序的兼容性,您应该使用等效的公共函数。有关详细信息,请参见头文件Winternl.h以及每个函数的文档。