gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:00:42 26 4
gpt4 key购买 nike

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

我是 Visual Studio 环境的新手,之前没有任何 visual studio 方面的经验,但广泛从事 g++ (linux/mingw-w64) 方面的工作。我正在使用的第三方库之一推荐使用 Visual Studios(与 g++ 一起使用时会导致链接器错误)。

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

LNK2001 unresolved external symbol "public: virtual void __cdecl CryptoPP::SHA3::Update(unsigned char const *,unsigned __int64)" (?Update@SHA3@CryptoPP@@UEAAXPEBE_K@Z) ConsoleApplication2 C:\Users\Admin\source\repos\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2.obj 1   

LNK2019 unresolved external symbol "public: virtual void __cdecl CryptoPP::SHA3::Restart(void)" (?Restart@SHA3@CryptoPP@@UEAAXXZ) referenced in function "public: __cdecl CryptoPP::SHA3::SHA3(unsigned int)" (??0SHA3@CryptoPP@@QEAA@I@Z) ConsoleApplication2 C:\Users\Admin\source\repos\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2.obj 1

Error LNK2001 unresolved external symbol "public: virtual void __cdecl CryptoPP::SHA3::TruncatedFinal(unsigned char *,unsigned __int64)" (?TruncatedFinal@SHA3@CryptoPP@@UEAAXPEAE_K@Z) ConsoleApplication2 C:\Users\Admin\source\repos\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2.obj 1

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

操作系统:Windows 10 专业版 64 位

开发环境:Visual Studios 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;
}

请告诉我如何在一些公共(public)文件夹中加载(复制)所有生成的 dll,就像 gcc 中的 make install 命令(工具)一样。

编辑:

我在附加依赖项中添加了 cryptopp.lib,并在附加库目录中添加了包含 cryptopp.lib 和 cryptopp.dll 的文件夹。我已经在 Path 环境变量中添加了目录。在 cryptolib 项目的 dll 生成期间,我在 Debug x64 配置中选择了 Multi Threaded Debug Dll。

最佳答案

Paul Sanders 非常正确,您要从 crypto++ DLL 使用的类和函数必须使用 _declspec(dllexport) / _declspec(dllimport) 进行限定。 .

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

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

GCC 默认导出所有内容,这就是共享库在 Linux 上为您工作的原因。

关于c++ - LNK2001 未解析的 SHA3 类成员的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50643097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com