LNK2001 неразрешенный внешний символ для членов класса SHA3 - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно вычислить 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 - я использую dll, созданную в mingw-w64)

ОС: Windows 10 Pro 64 bit

Среда разработки: 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;
}

Пожалуйста, посоветуйте мне, как загрузить (скопировать) все сгенерированные dll в некоторых распространенныхПапка, как команда (установка) make install в gcc.

Редактировать:

Я добавил cryptopp.lib в дополнительных зависимостях и добавил папку, содержащую как cryptopp.lib, так и cryptopp.dll вДополнительный библиотечный каталог.Я добавил каталог в переменную окружения Path.Я выбрал многопоточный отладочный Dll в конфигурации Debug x64 во время создания dll в проекте cryptolib.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Пол Сандерс совершенно прав, классы и функции, которые вы хотите использовать из библиотеки crypto ++, должны быть квалифицированы как _declspec (dllexport) / _declspec (dllimport) .

Некоторые из этихуже было сделано, как описано на Crypto ++ вики-странице для Fips dll .Он работает через макрос препроцессора CRYPTOPP_DLL, который определен в заголовке crypto ++ config.h и используется в fips140.h.

Однако существует проблема - не все требуемые алгоритмы есть в FIPS и,как вы обнаружили, не экспортируются для использования в DLL.Вы можете изменить другие заголовки, чтобы добавить экспорт / импорт DLL, но обратите внимание, что на вики-странице предлагается: «Если вам действительно нужна DLL, то предоставьте DLL-оболочку, которая связывается со статической библиотекой».Вместо того, чтобы оборачивать каждый компонент каждого используемого вами алгоритма crypto ++, было бы удобнее инкапсулировать целые операции в класс или функцию высокого уровня, которые затем экспортируются / импортируются из вашей DLL-оболочки.

GCC экспортирует все по умолчаниюВот почему в Linux у вас работают общие библиотеки.

0 голосов
/ 01 июня 2018

Вам нужно связать свое приложение с (я считаю) cryptopp.lib.Это возможно в отдельных версиях для 32-битной и 64-битной (я думаю, что имена в таблице импорта различаются), поэтому убедитесь, что вы используете правильную.

Вы можете сказать Visual Studio сделать это через Solution Explorer -> Щелкните правой кнопкой мыши на имени проекта -> Свойства -> Компоновщик -> Ввод -> Дополнительные зависимости.Затем просто соберите заново.

Ваше приложение должно быть в состоянии найти DLL в время выполнения , а не во время ссылки.Если этого не произойдет, вы получите сообщение об ошибке, сообщающее вам об этом при попытке запустить его.Обычно копирование библиотеки DLL в тот же каталог, что и исполняемый файл (и я надеюсь, что нет проблем с использованием библиотеки DLL, созданной mingw в Visual Studio).

...