【问题标题】:How to build Crypto++ 5.6.2 in for Qt with Visual Studio 2013?如何使用 Visual Studio 2013 为 Qt 构建 Crypto++ 5.6.2?
【发布时间】:2016-05-27 16:41:15
【问题描述】:

我正在尝试使用 Visual Studio 2013 为 Qt 构建 Crypto++ 5.6.2,但它会产生错误。这是我到目前为止所做的。

该页面上提到了 vs2010-dynamic.zip,但 ZIP 仅包含 VS2005 的 cryptest.sln。只是一个文件。但无论如何,我使用了文件:

Visual Studio 2010 及更高版本的预转换解决方案文件、项目文件和过滤器的存档。"

然后:

  • 在MSVC2013中打开cryptest.sln,为每个项目设置“多线程DLL(/MD)”(项目-->属性-->C/C++-->代码生成-->运行库--> /MD)

  • Build --> 'Batch Build' --> 检查 cryptdll、cryptest、cryptlib、dlltest (Release|win32) --> Build

它在DLL_Output 目录中生成了一个DLL 和LIB。然后我:

  • 将 DLL 移至 Qt 可执行文件所在的目录。
  • 在 Qt 中,我在test.pro 中添加了两行:
    • INCLUDEPATH += "../extern/msvc2013/cryptopp562/include"
    • LIBS += -L"..\extern\msvc2013\cryptopp562\include\cryptopp\Win32\DLL_Output\Release" -lcryptopp

但在 Qt 中,出现以下错误:

mainwindow.obj:-1: error: LNK2001: unresolved external symbol "public: virtual unsigned __int64 __thiscall CryptoPP::ThreadUserTimer::GetCurrentTimerValue(void)" (?GetCurrentTimerValue@ThreadUserTimer@CryptoPP@@UAE_KXZ)

mainwindow.obj:-1: error: LNK2001: unresolved external symbol "public: virtual unsigned __int64 __thiscall CryptoPP::ThreadUserTimer::TicksPerSecond(void)" (?TicksPerSecond@ThreadUserTimer@CryptoPP@@UAE_KXZ)

mainwindow.obj:-1: error: LNK2019: unresolved external symbol "class CryptoPP::NameValuePairs const & const CryptoPP::g_nullNameValuePairs" (?g_nullNameValuePairs@CryptoPP@@3ABVNameValuePairs@1@B) referenced in function "public: __thiscall CryptoPP::HMAC::HMAC(unsigned char const *,unsigned int)" (??0?$HMAC@VSHA256@CryptoPP@@@CryptoPP@@QAE@PBEI@Z)

release\user_account_registration.exe:-1: error: LNK1120: 3 unresolved externals

您知道为什么我会收到这些错误吗?

非常感谢任何帮助/评论/见解。

【问题讨论】:

  • "... 但是 vs2010-dynamic.zip 仅包含 VS2005 的 cryptest.sln..." - Arg... 听起来有些问题。给我几个小时,我会把它修好。顺便说一句,您应该只需要vs2010.zipvs2010-dynamic.zip。你不应该两者都需要。
  • 其他几项...不要使用 DLL,除非您有硬性要求。另请参阅 Crypto++ wiki 上的 FIPS DLL。当事情按预期工作时,如何将 Crypto++ 与 QT 集成:Integrate Crypto++ code to Qt Application In LinuxAdding Crypto++ .lib file to Qt project
  • @jww 首先,非常感谢您的 cmets 和链接。 “你不应该两者都需要” ==> 我猜是这样。 :) 修复后让我用 vs2010-dynamic.zip 再试一次。谢谢。
  • 上传了一个新的vs2010-dynamic.zip。项目文件可能会引用一些您没有的源文件,因为它是由最新的稳定源构建的。如果源文件丢失,则只需将其从项目文件中删除。您还应该考虑使用 Crypto++ 5.6.3 而不是 5.6.2。或者更好的是,使用来自Wei Dai's GitHub 的 ZIP。 Master是稳定的,不是实验性的;并且有 ChaCha、BLAKE2 等尚未在发行版 ZIP 中提供。对 Windows Phone、Windows 应用商店和通用 Windows 平台 (UWP) 也有更好的支持。
  • 顺便说一下,ZIP 还包括我用来从vs2010.zip 构建vs2010-dynamic.zip 的脚本。如果您发现任何问题,请指出它们或file a bug report。具有讽刺意味的是,它是一个在 Linux 和 OS X 上运行的 Bash 脚本,因为命令行工具要好一些。

标签: qt dll crypto++


【解决方案1】:
mainwindow.obj:-1: error: LNK2001: unresolved external symbol "public: virtual unsigned __int64 __thiscall CryptoPP::ThreadUserTimer::GetCurrentTimerValue(void)" (?GetCurrentTimerValue@ThreadUserTimer@CryptoPP@@UAE_KXZ)

mainwindow.obj:-1: error: LNK2001: unresolved external symbol "public: virtual unsigned __int64 __thiscall CryptoPP::ThreadUserTimer::TicksPerSecond(void)" (?TicksPerSecond@ThreadUserTimer@CryptoPP@@UAE_KXZ)

mainwindow.obj:-1: error: LNK2019: unresolved external symbol "class CryptoPP::NameValuePairs const & const CryptoPP::g_nullNameValuePairs" (?g_nullNameValuePairs@CryptoPP@@3ABVNameValuePairs@1@B) referenced in function "public: __thiscall CryptoPP::HMAC::HMAC(unsigned char const *,unsigned int)" (??0?$HMAC@VSHA256@CryptoPP@@@CryptoPP@@QAE@PBEI@Z)

如果您查看hrtimer.h 的源代码,ThreadUserTimer 缺少CRYPTOPP_DLL。这意味着 DLL 不会导出 ThreadUserTimer(和许多其他类)。

一般来说,您应该避免使用FIPS DLL,除非您有硬性要求。它的特殊用途,并且不容易使用。它还具有 FIPS 140-2 的操作环境要求。我怀疑你想把自己限制在 Visual Studio 2005 和 Windows Server 2003 上。

如果您坚持使用FIPS DLL,那么您需要按预期链接DLL。 “如预期”意味着您在编译/链接时使用 cryptopp.lib 导入库;和cryptopp.dll 在运行时。您还必须再次链接 cryptlib.lib 以获取缺少的类,例如 ThreadUserTimer,同时设置 CRYPTOPP_IMPORTS 以避免在使用这两个库时出现重复符号。


不要使用 DLL,而是下载更新的(和修复的)vs2010-dynamic.zip。使用它来构建 Crypto++ 库,然后使用静态库。 “使用静态库”意味着只链接到cryptlib.lib

来自vs2010-dynamic.zip 的项目文件可能会引用一些您没有的源文件,因为它是由最新的稳定源构建的。如果源文件丢失,则只需将其从项目文件中删除。在我的脑海中,Crypto++ 5.6.2 应该缺少 HKDF、RDRAND、RDSEED、ChaCha、BLAKE2、Base64URLEncoder、Base64URLDecoder 等。它还缺少将 bench.cpp 重命名为 bench1.cpp

Visual Studio wiki 页面包含有关 Windows 项目文件和工件的更多信息,例如 cryptlib.lib


INCLUDEPATH += ".../cryptopp562/include"
LIBS += -L"...\cryptopp562\include\cryptopp\Win32\DLL_Output\Release" -lcryptopp

我认为您应该只使用 -lcryptlib,因为它是静态库,并且拥有您需要的一切。库的路径是$(Platform)\Output\$(Configuration),但我不知道如何将它翻译成QT composer可以使用的东西。

否则,我认为您需要同时指定-lcryptopp -lcryptlib,并将CRYPTOPP_IMPORTS 添加到预处理器定义中。


vs2010.zipvs2010-dynamic.zipvs2005-dynamic.zip 是从 latest GitHub sources 构建的。在撰写本文时(2016 年 6 月 1 日),这实际上是 Crypto++ 5.6.4 之前的版本。如果您使用低级别 Crypto++ 的 ZIP 文件,例如 5.6.2 或 5.6.3,那么您会遇到一些小问题。

我知道有两个小问题。首先是bench.cpp to bench1.cpp 的重命名。它的错误是:

  • C1083: Cannot open source file: 'bench1.cpp': No such file or directory
  • LNK2001: unresolved external symbol "void __cdecl OutputResultOperations(char const *,char const *,bool,unsigned long,double)" (?OutputResultOperations@@YAXPBD0_NKN@Z)

解决方法是 (1) 在记事本中打开 cryptest.vcxproj,找到 bench1.cpp,然后将其重命名为 bench.cpp。或者 (2) 在文件系统上将 bench.cpp 重命名为 bench1.cpp

第二个问题有点棘手,因为它是一个移动的目标。下级版本(如 5.6.2 或 5.6.3)缺少 GitHub 中可用的最新类。它们包括HKDF(5.6.3)、RDRAND(5.6.3)、RDSEED(5.6.3)、ChaCha(5.6.4)、BLAKE2(5.6.4)、Poly1305(5.6.4)等。

解决方法是从 Visual Studio 项目文件中删除缺少的源文件,因为它们对于下级版本不存在。

另一种选择是从最新来源添加缺少的类文件,但可能会出现复杂情况。例如,许多来源巧妙地依赖于最新的config.hcpu.hcpu.cpp。 “微妙之处”是你不会意识到你正在学习一个表现不佳的课程。

表现不佳的一个例子是 BLAKE2。 config.h 添加编译时 ARM-32 和 ARM-64 检测。 cpu.hcpu.cpp 添加运行时 ARM 指令检测。如果您在没有其他文件的情况下添加 BLAKE2,则不会发生任何检测,您将获得直接的 C/C++ 实现。 NEON 实现每个字节运行大约 9 到 12 个周期,而 C/C++ 实现每个字节运行大约 40 个周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2023-03-22
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多