C++ SHA3类成员的LNK2001未解析外部符号

C++ SHA3类成员的LNK2001未解析外部符号,c++,visual-studio,crypto++,C++,Visual Studio,Crypto++,我需要在我的程序中计算SHA3以及在套接字中使用AES,并决定使用crypto++库 我是Visual Studio环境的新手,之前没有Visual Studio方面的经验,但在g++(linux/mingw-w64)方面做过大量工作。我使用的第三部分库之一推荐了Visual Studio(与g++一起使用时会导致链接器错误) 我收到一个链接器错误。 错误: 相同的代码在g++中正常工作(mingw-w64-我正在使用在mingw-w64中创建的dll) 操作系统:Windows 10 Pro

我需要在我的程序中计算SHA3以及在套接字中使用AES,并决定使用crypto++库

我是Visual Studio环境的新手,之前没有Visual Studio方面的经验,但在g++(linux/mingw-w64)方面做过大量工作。我使用的第三部分库之一推荐了Visual Studio(与g++一起使用时会导致链接器错误)

我收到一个链接器错误。 错误:

相同的代码在g++中正常工作(mingw-w64-我正在使用在mingw-w64中创建的dll)

操作系统:Windows 10 Pro 64位

开发环境:Visual Studio 2017

目标:调试x64

资料来源:

#include <sha3.h>
#include <filters.h>
#include <hex.h>
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <base64.h>

int main()
{
    CryptoPP::SHA3_512 hash;

    std::cout << hash.AlgorithmName() << " Test." << std::endl;

    std::string in = "The quick brown fox jumps over the lazy dog";
    std::vector<CryptoPP::byte> out(hash.DigestSize());

    hash.CalculateTruncatedDigest(&out[0], hash.DigestSize(), reinterpret_cast<CryptoPP::byte*>(&in[0]), in.size());

    std::cout << in << std::endl;

    std::cout.setf(std::ios::hex, std::ios::basefield);

    for_each(out.begin(), out.end(), [](CryptoPP::byte i) {
        printf("%x", i);
    });

    std::cout << "Original String : " << str << std::endl;
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
CryptoPP::SHA3_512哈希;

std::cout您需要将应用程序链接到(我相信)
cryptopp.lib
。这可能有32位和64位的不同版本(我相信导入表中的名称不同),因此请确保使用正确的版本

您可以通过解决方案资源管理器->右键单击项目名称->属性->链接器->输入->其他依赖项来告诉Visual Studio执行此操作。然后重新构建


你的应用程序需要能够在运行时找到DLL,而不是在链接时。如果找不到,你将在尝试运行它时收到一条错误消息。人们通常会将DLL复制到与可执行文件相同的目录中(我希望在Visual Studio中使用mingw创建的DLL不会有问题).

Paul Sanders是非常正确的,您想从crypto++DLL中使用的类和函数必须经过验证

其中一些已经完成,如中所述。它通过预处理器宏
CRYPTOPP_DLL
工作,该宏在crypto++头
config.h
中定义,并在
fips140.h
中使用

但有一个问题-并非所有您想要的算法都在FIPS中,并且正如您所发现的,没有导出以在DLL中使用。您可以修改其他标题以添加DLL导出/导入,但请注意wiki页面建议:“如果您确实需要DLL,请提供一个与静态库链接的包装DLL。”。与其包装您使用的每个crypto++算法的每个组件,不如将整个操作封装到高级类或函数中,然后从包装器DLL导出/导入


GCC默认导出所有内容,这就是为什么共享库在Linux上工作。

您需要有.lib和.dll文件。转到您的项目->右键单击属性->链接部分下的“选择输入->此处提及您要使用的所有.lib dll。然后在链接器->Ge中提供放置它们的dll路径nera->附加包括directories@StraightCirle,但仍然没有成功。抱歉,我应该在我的原始帖子中提到。另请参见Crypto++wiki。旧的/过时的FIPS DLL不包括SHA3,因为SHA3早于上次FIPS验证。您可能希望避免使用FIPS DLL,而只使用静态库。静态库rary被称为
cryptolib.lib
。wiki上另一个有趣的页面是。我在其他依赖项“cryptopp.lib”中添加了.lib。在cryptolib项目的Dll生成过程中,我在Debug x64配置中选择了多线程调试Dll。它起作用了吗?我猜的是.lib文件的名称,如果它作为包的一部分到达,我不知道您在磁盘上的何处可以找到它。如果您有有用的其他信息,您可以编辑我的post.OTOH,如果您是如果您自己对CytoLeIB DLL进行了编程,那么您应该确保属性-> C++ +>代码生成->运行库与您的应用程序匹配(当然,您也知道在哪里找到.LIB)。。它不起作用。cryptopp.lib和cryptopp.dll是在我在Visual Studio 2017中以调试x64配置和运行时库设置为多线程调试dll(/MDd)的方式构建cryptopp后生成的。我正在以相同的运行时库模型按应用程序进行构建。我在其他库中指定了cryptopp.lib,还添加了必要的路径。相同的错误消息?将
crypto++
构建为静态库可能更容易,它实际上不需要是DLL。不过,您需要创建一个新的项目文件(我的意思是构建静态库)。您现在使用的静态库来自哪里?是否随软件包提供?此项目的系统架构要求我使用共享库。使用g++(mingw-w64)时我使用libcryptopp作为共享库部署了系统。如果所有其他选项都已用尽,那么我将构建一个静态库,但在此之前,我必须尝试解决链接器问题。
#include <sha3.h>
#include <filters.h>
#include <hex.h>
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <base64.h>

int main()
{
    CryptoPP::SHA3_512 hash;

    std::cout << hash.AlgorithmName() << " Test." << std::endl;

    std::string in = "The quick brown fox jumps over the lazy dog";
    std::vector<CryptoPP::byte> out(hash.DigestSize());

    hash.CalculateTruncatedDigest(&out[0], hash.DigestSize(), reinterpret_cast<CryptoPP::byte*>(&in[0]), in.size());

    std::cout << in << std::endl;

    std::cout.setf(std::ios::hex, std::ios::basefield);

    for_each(out.begin(), out.end(), [](CryptoPP::byte i) {
        printf("%x", i);
    });

    std::cout << "Original String : " << str << std::endl;
    return 0;
}