C++ 对_imp的未定义引用__CryptProtectData@28

C++ 对_imp的未定义引用__CryptProtectData@28,c++,windows,qt,encryption,C++,Windows,Qt,Encryption,我正在尝试使用windows.h和wincrypt.h库构建一个简单的应用程序,以便对一些字符串进行加密 当我调用CryptProtectData&input函数时,NULL,NULL,NULL,NULL,0,&output;我得到一个错误: error: undefined reference to `_imp__CryptProtectData@28' 我在网上搜索了很多,但没有找到多少。我还意识到Chromium浏览器使用与我类似的代码来加密和解密它的登录,我并没有做任何不同的事情 我正

我正在尝试使用windows.h和wincrypt.h库构建一个简单的应用程序,以便对一些字符串进行加密

当我调用CryptProtectData&input函数时,NULL,NULL,NULL,NULL,0,&output;我得到一个错误:

error: undefined reference to `_imp__CryptProtectData@28'
我在网上搜索了很多,但没有找到多少。我还意识到Chromium浏览器使用与我类似的代码来加密和解密它的登录,我并没有做任何不同的事情

我正在使用QtCreator IDE编译代码

我的一些代码:

  std::string plaintext="Some plain text";
  DATA_BLOB input;
  input.pbData = const_cast<BYTE*>(
      reinterpret_cast<const BYTE*>(plaintext.data()));
  input.cbData = static_cast<DWORD>(plaintext.length());

  DATA_BLOB output;
  BOOL result = CryptProtectData(&input, NULL, NULL, NULL, NULL,
                                 0, &output);

编辑:忘了提到我已经包括了windows.h和wincrypt.h库,当然。

这是一个链接器错误,因为您没有提供CryptProtectData函数所需的库文件。您需要将Crypt32库传递给链接器

此信息包含在功能的中。向下滚动至主题底部以查看信息

一般来说,为了使用API函数,您需要查看函数文档中的“需求”部分。其中列出了以下信息:

支持的最低Windows版本。 需要包含的头文件。 需要传递给链接器的库文件。
这是由于您没有提供CryptProtectData函数所需的库文件而导致的链接器错误。您需要将Crypt32库传递给链接器

此信息包含在功能的中。向下滚动至主题底部以查看信息

一般来说,为了使用API函数,您需要查看函数文档中的“需求”部分。其中列出了以下信息:

支持的最低Windows版本。 需要包含的头文件。 需要传递给链接器的库文件。
您是否链接到Crypt32.dll或Crypt32.lib?将.lib添加到依赖项中。出现此类错误时,请始终查看。

是否链接到Crypt32.dll或Crypt32.lib?将.lib添加到依赖项中。出现此类错误时,请始终查看。

编译整批代码时使用的命令行是什么?这个错误似乎是您缺少了一个库。@antonijn我将编译交给qt,它会在.pro项目文件中获取一个文件。我应该在那里做链接,但我不确定具体是怎么做的。你用什么命令行来编译整个代码?这个错误似乎是您缺少了一个库。@antonijn我将编译交给qt,它会在.pro项目文件中获取一个文件。在那里我应该做链接,但我不确定具体如何。谢谢你的回答,我习惯于用linux编程,所有链接都是通过pkg进行的,所以我不必手动完成。如何将我的项目链接到crypt32.dll?我在C:\Windows\System32上找到了它,正如我所说的,我正在使用Qt。我尝试添加到.pro文件:INCLUDEPATH+=C:\Windows\System32和LIBS+=C:\Windows\System32\crypt32.dll,但没有效果。需要传递到链接器的是.lib文件,而不是dll。DLL在运行时加载。.lib文件位于编译器引用的Windows SDK中。我希望您的link命令还列出了user32、kernel32等.lib文件。您只需要添加crypt32。您使用的是哪种编译器?好的,我猜是g++。我不确定IDE如何允许您设置链接器选项。@user9379我不确定Qt,但windows提供了包含符号的.lib文件。可以在Qt中添加.lib文件吗?不要将system32添加到INCLUDEPATH。请将crypt32添加到LIBS。对语法没有100%的把握。您不需要包含路径。100%确定system32中的任何内容在链接阶段都不相关。只需复制为内核32等所做的工作。非常感谢您的努力。我知道问题在于链接特定的库。如何做到这一点是Qt特有的,与此无关,因此,我将此答案标记为正确答案。感谢您的回答,我习惯于使用linux编程,所有链接都是通过pkg完成的,因此我不必手动完成。如何将我的项目链接到crypt32.dll?我在C:\Windows\System32上找到了它,正如我所说的,我正在使用Qt。我尝试添加到.pro文件:INCLUDEPATH+=C:\Windows\System32和LIBS+=C:\Windows\System32\crypt32.dll,但没有效果。需要传递到链接器的是.lib文件,而不是dll。DLL在运行时加载。.lib文件位于编译器引用的Windows SDK中。我希望您的link命令还列出了user32、kernel32等.lib文件。您只需要添加crypt32。您使用的是哪种编译器?好的,我猜是g++。我不确定IDE如何允许您设置链接器选项。@user9379我不确定Qt,但windows提供了包含符号的.lib文件。可以在Qt中添加.lib文件吗?不要将system32添加到INCLUDEPATH。请将crypt32添加到LIBS。对语法没有100%的把握。
您不需要包含路径。100%确定system32中的任何内容在链接阶段都不相关。只需复制为内核32等所做的工作。非常感谢您的努力。我知道问题在于链接特定的库。如何做到这一点是Qt特有的,而且与此无关,因此,我认为这个答案是正确的。