mainwindow.obj:-1: error: LNK2001: unresolved external symbol "public: virtual unsigned __int64 __thiscall CryptoPP::ThreadUserTimer::GetCurrentTimerValue(void)" (?GetCurrentTimerValue@ThreadUserTimer@CryptoPP@@UAE_KXZ)
mainwindow.obj:-1: error: LNK2001: unresolved external symbol "public: virtual unsigned __int64 __thiscall CryptoPP::ThreadUserTimer::TicksPerSecond(void)" (?TicksPerSecond@ThreadUserTimer@CryptoPP@@UAE_KXZ)
mainwindow.obj:-1: error: LNK2019: unresolved external symbol "class CryptoPP::NameValuePairs const & const CryptoPP::g_nullNameValuePairs" (?g_nullNameValuePairs@CryptoPP@@3ABVNameValuePairs@1@B) referenced in function "public: __thiscall CryptoPP::HMAC::HMAC(unsigned char const *,unsigned int)" (??0?$HMAC@VSHA256@CryptoPP@@@CryptoPP@@QAE@PBEI@Z)
Если вы посмотрите на исходный код для hrtimer.h, ThreadUserTimer
отсутствует CRYPTOPP_DLL
. Это означает, что DLL не экспортирует ThreadUserTimer
(и многие другие классы).
Как правило, вам следует избегать использования FIPS DLL, если у вас нет жестких требований к этому. Это специальное назначение, и с ним непросто работать. Он также соответствует требованиям Операционной среды из FIPS 140-2. Я сомневаюсь, что вы захотите ограничиться Visual Studio 2005 и Windows Server 2003.
Если вы настаиваете на использовании DLL FIPS, вам необходимо связать DLL, как и ожидалось. «Как и ожидалось» означает, что вы используете библиотеку импорта cryptopp.lib
во время компиляции/компоновки; и cryptopp.dll
во время выполнения. Вы также должны снова связать cryptlib.lib
, чтобы получить отсутствующие классы, такие как ThreadUserTimer
, при установке CRYPTOPP_IMPORTS
, чтобы избежать дублирования символов при использовании обеих библиотек.
Вместо использования DLL загрузите обновленную (и исправленную) vs2010-dynamic.zip
. Используйте его для создания библиотеки Crypto++, а затем используйте статическую библиотеку. «Использовать статическую библиотеку» означает компоновать только cryptlib.lib
.
Файлы проекта из vs2010-dynamic.zip
могут ссылаться на некоторые исходные файлы, которых у вас нет, поскольку они созданы из последних стабильных источников. Если исходный файл отсутствует, то просто удалите его из файла проекта. На мой взгляд, в Crypto++ 5.6.2 должны отсутствовать HKDF, RDRAND, RDSEED, ChaCha, BLAKE2, Base64URLEncoder, Base64URLDecoder и т. д. Также отсутствует переименование bench.cpp
в bench1.cpp
.
Вики-страница Visual Studio содержит дополнительную информацию о файлах проекта Windows и таких артефактах, как cryptlib.lib
.
INCLUDEPATH += ".../cryptopp562/include"
LIBS += -L"...\cryptopp562\include\cryptopp\Win32\DLL_Output\Release" -lcryptopp
Я думаю, вам следует использовать только -lcryptlib
, потому что это статическая библиотека, и в ней есть все, что вам нужно. Путь к библиотеке $(Platform)\Output\$(Configuration)
, но я не знаю, как перевести его во что-то, что может использовать QT composer.
В противном случае, я думаю, вам нужно указать как -lcryptopp -lcryptlib
, так и добавить CRYPTOPP_IMPORTS
в определения препроцессора.
vs2010.zip
, vs2010-dynamic.zip
и vs2005-dynamic.zip
созданы из последние исходники GitHub. На момент написания этой статьи (1 июня 2016 г.) это фактически предшествует Crypto++ 5.6.4. Если вы используете ZIP-файлы с более низким уровнем Crypto++, например 5.6.2 или 5.6.3, вы столкнетесь с небольшими проблемами.
Есть две небольшие проблемы, о которых я знаю. Во-первых, это переименование bench.cpp
в bench1.cpp
. Его ошибка либо:
C1083: Cannot open source file: 'bench1.cpp': No such file or directory
LNK2001: unresolved external symbol "void __cdecl OutputResultOperations(char const *,char const *,bool,unsigned long,double)" (?OutputResultOperations@@YAXPBD0_NKN@Z)
Исправление состоит в том, чтобы либо (1) открыть cryptest.vcxproj
в блокноте, найти bench1.cpp
, а затем переименовать его в bench.cpp
. Или (2) переименуйте bench.cpp
в bench1.cpp
в файловой системе.
Вторая проблема немного сложнее, потому что это движущаяся цель. В выпусках нижнего уровня, таких как 5.6.2 или 5.6.3, отсутствуют последние классы, доступные на GitHub. К ним относятся HKDF (5.6.3), RDRAND (5.6.3), RDSEED (5.6.3), ChaCha (5.6.4), BLAKE2 (5.6.4), Poly1305 (5.6.4) и т. д.
Исправление заключается в удалении отсутствующих исходных файлов из файлов проекта Visual Studio, поскольку они не существуют для выпусков нижнего уровня.
Другой вариант — добавить отсутствующие файлы классов из последних источников, но могут возникнуть сложности. Например, многие исходники тонко зависят от последних config.h
, cpu.h
и cpu.cpp
. «Тонкость» в том, что вы не поймете, что получаете неэффективный класс.
Примером неэффективного класса является BLAKE2. config.h
добавляет обнаружение ARM-32 и ARM-64 во время компиляции. cpu.h
и cpu.cpp
добавляют обнаружение инструкций ARM во время выполнения. Если вы добавите BLAKE2 без других файлов, то никакое обнаружение не произойдет, и вы получите прямую реализацию C/C++. Реализация NEON выполняет от 9 до 12 тактов на байт, а реализация C/C++ — около 40 тактов на байт.
person
jww
schedule
28.05.2016
vs2010.zip
илиvs2010-dynamic.zip
. Вы не должны нуждаться в обоих. - person jww   schedule 28.05.2016vs2010-dynamic.zip
. Файлы проекта могут ссылаться на некоторые исходные файлы, которых у вас нет, поскольку они созданы из последних стабильных источников. Если исходный файл отсутствует, то просто удалите его из файла проекта. Вам также следует рассмотреть возможность использования Crypto++ 5.6.3 вместо 5.6.2. Или лучше используйте ZIP-файл с GitHub Вей Дая. Мастер стабильный, а не экспериментальный; и имеет ChaCha, BLAKE2 и т. д., которые еще не доступны в ZIP-архиве. Также улучшена поддержка Windows Phone, Магазина Windows и универсальной платформы Windows (UWP). - person jww   schedule 28.05.2016vs2010-dynamic.zip
изvs2010.zip
. Если вы обнаружите какие-либо проблемы, укажите на них или отправьте отчет об ошибке. По иронии судьбы, это скрипт Bash, который работает в Linux и OS X, потому что инструменты командной строки немного лучше. - person jww   schedule 28.05.2016cannot open file... rdrand.asm...
— Верно. HKDF, RDRAND, RDSEED, ChaCha и другие появились после версии 5.6.2. В частности, в случае RDRAND это было указано в 5.6.3. Удалите их из файлов проекта. Или используйте ZIP-файл с GitHub Вей Дая.bench1.cpp
недавно был переименован. Раньше он называлсяbench.cpp
. См. также Переименуйте файл Bench.cpp в Bench1.cpp на список рассылки. - person jww   schedule 01.06.2016