我需要在程序中计算SHA3以及在套接字中使用AES并决定使用crypto ++库。
我是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 Pro 64位
开发环境:2017年Visual Studios
目标:调试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;
}
请告诉我如何在gcc中加载(复制)所有生成的dll,就像make install命令(facility)一样。
编辑:
我在其他依赖项中添加了cryptopp.lib,并在附加库目录中添加了包含cryptopp.lib和cryptopp.dll的文件夹。我在Path环境变量中添加了目录。我在cryptolib项目的dll生成期间选择了Debug x64配置中的Multi Threaded Debug Dll。
答案 0 :(得分:1)
Paul Sanders非常正确,您想要使用crypto ++ DLL的类和函数必须使用_declspec(dllexport) / _declspec(dllimport)进行限定。
其中一些已经完成,如Crypto++ wiki page for Fips dll中所述。它通过预处理器宏CRYPTOPP_DLL
工作,该宏在crypto ++标头config.h
中定义并在fips140.h
中使用。
但是存在一个问题 - 并非您想要的所有算法都使用FIPS,并且正如您所发现的那样,不会导出用于DLL的算法。您可以修改其他标头以添加DLL导出/导入,但请注意,Wiki页面建议:&#34;如果您确实需要DLL,则提供链接到静态库的包装DLL。&#34;。不是包装你使用的每个加密++算法的每个组件,而是将整个操作封装到高级类或函数中更方便,然后从包装器DLL导出/导入。
GCC默认导出所有内容,这就是共享库在Linux上为您工作的原因。
答案 1 :(得分:0)
您需要将您的应用与(我相信)cryptopp.lib
相关联。这可能是32位和64位的单独版本(我相信导入表中的名称不同)所以请确保使用正确的。
您可以通过解决方案资源管理器告诉Visual Studio执行此操作 - &gt;右键单击项目名称 - &gt;属性 - &gt;链接器 - &gt;输入 - &gt;额外的依赖关系。然后再建一次。
您的应用需要能够在运行时中找到DLL,而不是在链接时。如果它不能,那么当您尝试运行它时,会收到一条错误消息。将DLL复制到与可执行文件相同的目录是人们通常所做的事情(我希望在Visual Studio中使用mingw创建的DLL没有问题。)