2016-05-27 3 views
0

Я пытаюсь построить 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 и задает «Multi-threaded DLL (/ MD)» для каждого проекта (проект -> свойства -> C/C++ -> Генерация кода -> Библиотека времени выполнения ->/MD)

  • Build -> 'Batch Сложение' -> Проверить cryptdll, cryptest, cryptlib, dlltest (Release | win32) -> Build

Это привело к DLL и LIB в DLL_Output каталоге. I then:

  • Перемещено DLL в каталог, в котором находится исполняемый файл Qt.
  • В Qt, я добавил две строки 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)" ([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) 

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

У вас есть идеи, почему я получаю эрро RS?

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

+0

* "... но vs2010-dynamic.zip содержит только cryptest.sln для VS2005 ..." * - Arg ... что-то звучит сломано. Дайте мне несколько часов, и я исправлю это. Кстати, вам нужно только «vs2010.zip» или 'vs2010-dynamic.zip'. Вам не нужны оба. – jww

+0

Несколько других предметов ... Не используйте 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

+0

@jww Прежде всего, большое спасибо за ваши комментарии и ссылки. «Вам не нужны оба» ==> Я догадался. :) Позвольте мне попробовать снова с vs2010-dynamic.zip после того, как он будет исправлен. Благодарю. –

ответ

0
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 циклов на каждый байт.