mainwindow.obj:-1: error: LNK2001: unresolved external symbol "public: virtual unsigned __int64 __thiscall CryptoPP::ThreadUserTimer::GetCurrentTimerValue(void)" ([email protected]@[email protected]@UAE_KXZ)
mainwindow.obj:-1: error: LNK2001: unresolved external symbol "public: virtual unsigned __int64 __thiscall CryptoPP::ThreadUserTimer::TicksPerSecond(void)" ([email protected]@[email protected]@UAE_KXZ)
mainwindow.obj:-1: error: LNK2019: unresolved external symbol "class CryptoPP::NameValuePairs const & const CryptoPP::g_nullNameValuePairs" ([email protected]@@[email protected]@B) referenced in function "public: __thiscall CryptoPP::HMAC::HMAC(unsigned char const *,unsigned int)" ([email protected]@[email protected]@@[email protected]@[email protected]@Z)
Если вы посмотрите на исходный код для hrtimer.h, ThreadUserTimer
отсутствует CRYPTOPP_DLL
. Это означает, что DLL не экспортирует ThreadUserTimer
(и многие другие классы).
В общем, вам следует избегать FIPS DLL, если у вас нет жестких требований. Его особая цель, и с ней нелегко работать. Он также имеет Условия эксплуатации Требования от FIPS 140-2. Я сомневаюсь, что вы хотите ограничить себя Visual Studio 2005 и Windows Server 2003.
Если вы настаиваете на использовании FIPS DLL, вам необходимо установить ссылку на 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.
В противном случае, я думаю, вам нужно указать как -lcryptopp -lcryptlib
, так и добавить CRYPTOPP_IMPORTS
в определения препроцессора.
vs2010.zip
, vs2010-dynamic.zip
и vs2005-dynamic.zip
построены из latest GitHub sources. Начиная с этой записи (JUN 1 2016), это эффективно pre-Crypto ++ 5.6.4. Если вы используете ZIP-файлы с нижним уровнем Crypto ++, например 5.6.2 или 5.6.3, тогда вы столкнетесь с незначительными проблемами.
Есть две незначительные проблемы, о которых я знаю. Первое - это переименование bench.cpp
to 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)" ([email protected]@[email protected])
Исправление либо (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 циклов на каждый байт.
* "... но vs2010-dynamic.zip содержит только cryptest.sln для VS2005 ..." * - Arg ... что-то звучит сломано. Дайте мне несколько часов, и я исправлю это. Кстати, вам нужно только «vs2010.zip» или 'vs2010-dynamic.zip'. Вам не нужны оба. – jww
Несколько других предметов ... Не используйте DLL, если у вас нет жесткого требования. Также см. [FIPS DLL] (http://www.cryptopp.com/wiki/FIPS_DLL) в вики Crypto ++. Вот как интегрировать Crypto ++ с QT, когда все работает как ожидалось: [Интегрируйте код Crypto ++ в приложение Qt в Linux] (http://stackoverflow.com/q/31660366) и [Добавить файл Crypto ++ .lib в проект Qt] (http : //stackoverflow.com/q/23223528). – jww
@jww Прежде всего, большое спасибо за ваши комментарии и ссылки. «Вам не нужны оба» ==> Я догадался. :) Позвольте мне попробовать снова с vs2010-dynamic.zip после того, как он будет исправлен. Благодарю. –