Как собрать Crypto++ 5.6.2 для Qt с помощью Visual Studio 2013?

Я пытаюсь собрать Crypto++ 5.6.2 для Qt с Visual Studio 2013, но это приводит к ошибкам. Вот что я сделал до сих пор.

На странице говорится о vs2010-dynamic.zip, но ZIP включает только cryptest.sln для VS2005. Всего один файл. Но в любом случае я использовал файл:

архив предварительно преобразованного файла решения, файлов проекта и фильтров для Visual Studio 2010 и выше."

После, я:

  • Открыл cryptest.sln в MSVC2013 и установил "Многопоточная DLL (/MD)" для каждого проекта (проект --> свойства --> C/C++ --> Генерация кода --> Библиотека времени выполнения --> /MD)

  • Сборка --> 'Пакетная сборка' --> Проверка cryptdll, cryptest, cryptlib, dlltest (Release|win32) --> Сборка

Это привело к созданию DLL и LIB в каталоге DLL_Output. После, я:

  • Перемещена DLL в каталог, где находится исполняемый файл Qt.
  • In Qt, I added two lines to test.pro:
    • INCLUDEPATH += "../extern/msvc2013/cryptopp562/include"
    • LIBS += -L"..\extern\msvc2013\cryptopp562\include\cryptopp\Win32\DLL_Output\Release" -lcryptopp

Но в Qt у меня есть следующие ошибки:

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)

release\user_account_registration.exe:-1: error: LNK1120: 3 unresolved externals

У вас есть идеи, почему я получаю ошибки?

Любая помощь/комментарий/понимание будет действительно оценена.


person Sam Kim    schedule 27.05.2016    source источник
comment
... но vs2010-dynamic.zip включает только cryptest.sln для VS2005... - Arg... что-то не работает. Дайте мне несколько часов, и я все исправлю. Кстати, вам нужно только vs2010.zip или vs2010-dynamic.zip. Вы не должны нуждаться в обоих.   -  person jww    schedule 28.05.2016
comment
Несколько других пунктов... Не используйте DLL, если у вас нет жестких требований к этому. Также см. FIPS DLL на вики Crypto++. Вот как интегрировать Crypto++ с QT, когда все работает должным образом: Интеграция кода Crypto++ в приложение Qt в Linux и Добавление файла Crypto++ .lib в проект Qt.   -  person jww    schedule 28.05.2016
comment
@jww Прежде всего, большое спасибо за ваши комментарии и ссылки. Вам не нужно и то, и другое ==> Я так догадался. :) Позвольте мне попробовать снова с vs2010-dynamic.zip после того, как это будет исправлено. Спасибо.   -  person Sam Kim    schedule 28.05.2016
comment
Был загружен новый vs2010-dynamic.zip. Файлы проекта могут ссылаться на некоторые исходные файлы, которых у вас нет, поскольку они созданы из последних стабильных источников. Если исходный файл отсутствует, то просто удалите его из файла проекта. Вам также следует рассмотреть возможность использования Crypto++ 5.6.3 вместо 5.6.2. Или лучше используйте ZIP-файл с GitHub Вей Дая. Мастер стабильный, а не экспериментальный; и имеет ChaCha, BLAKE2 и т. д., которые еще не доступны в ZIP-архиве. Также улучшена поддержка Windows Phone, Магазина Windows и универсальной платформы Windows (UWP).   -  person jww    schedule 28.05.2016
comment
Кстати, в ZIP также есть скрипт, который я использую для сборки vs2010-dynamic.zip из vs2010.zip. Если вы обнаружите какие-либо проблемы, укажите на них или отправьте отчет об ошибке. По иронии судьбы, это скрипт Bash, который работает в Linux и OS X, потому что инструменты командной строки немного лучше.   -  person jww    schedule 28.05.2016
comment
@jww Спасибо за ваши комментарии. На самом деле, я буду работать над этим в ближайшее время.   -  person Sam Kim    schedule 31.05.2016
comment
@jww Я скопировал файлы vs2010-dynamic.zip в папку cryptopp562 и попытался выполнить сборку с помощью msvc2013, но получил следующие ошибки. 1› Сборка: C:\Users\skim\Desktop\Hyrule\user_account_registration\extern\msvc2013\cryptopp562\include\cryptopp562\rdrand.asm 1›MASM: фатальная ошибка A1000: невозможно открыть файл: C:\Users\skim\Desktop \Hyrule\user_account_registration\extern\msvc2013\cryptopp562\include\cryptopp562\rdrand.asm 2>c1xx: фатальная ошибка C1083: невозможно открыть исходный файл: 'bench1.cpp': нет такого файла или каталога, кстати, статическая библиотека работала хорошо кв. Спасибо.   -  person Sam Kim    schedule 01.06.2016
comment
cannot 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
comment
@jww Хорошо. Сейчас здание работает. :) Как вы упомянули. Если вы посмотрите на исходный код hrtimer.h, в ThreadUserTimer отсутствует CRYPTOPP_DLL. Это означает, что DLL не экспортирует ThreadUserTimer (и многие другие классы). На данный момент мне может понадобиться использовать статическую библиотеку, но я думаю, что наконец-то у меня есть рабочая версия на основе dll. Спасибо большое за вашу помощь. :)   -  person Sam Kim    schedule 01.06.2016
comment
Отлично. Вы решили использовать DLL+LIB? Если это так, я могу предоставить более подробные инструкции для него на вики-страницах Visual Studio и FIPS DLL (я пытался отговорить людей от его использования). Кроме того, вы должны нажать ✓ в ответе ниже, если он решил ваши проблемы. Это поможет другим посетителям Stack Overflow. Если это не помогло, то не проверяйте.   -  person jww    schedule 01.06.2016
comment
@jww Я обсуждал со своим боссом, и он сказал, что пока у нас все хорошо со статической библиотекой, но я так счастлив, что у нас есть рабочая версия dll и lib. Большое спасибо. :)   -  person Sam Kim    schedule 01.06.2016


Ответы (1)


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