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

时间:2018-06-01 12:08:05

标签: c++ visual-studio crypto++

我需要在程序中计算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。

2 个答案:

答案 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没有问题。)