Я загрузил и извлек Crypto ++ в C: \ cryptopp. Я использовал Visual Studio Express 2012 для сборки всех проектов внутри (как указано в readme), и все было построено успешно. Затем я сделал тестовый проект в какой-то другой папке и добавил cryptolib в качестве зависимости. После этого я добавил путь включения, чтобы я мог легко включить все заголовки. Когда я пытался скомпилировать, у меня возникла ошибка о неразрешенных символах.
Чтобы исправить это, я добавил C:\cryptopp\Win32\Output\Debug\cryptlib.lib
ссылки на дополнительные зависимости. Теперь я получаю такую ошибку:
Error 1 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(cryptlib.obj) CryptoTest
Error 2 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(iterhash.obj) CryptoTest
Error 3 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(sha.obj) CryptoTest
Error 4 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(pch.obj) CryptoTest
Error 5 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(misc.obj) CryptoTest
Error 6 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(queue.obj) CryptoTest
Error 7 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(algparam.obj) CryptoTest
Error 8 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(filters.obj) CryptoTest
Error 9 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(fips140.obj) CryptoTest
Error 10 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(cpu.obj) CryptoTest
Error 11 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(mqueue.obj) CryptoTest
Я также получаю:
Error 12 error LNK2005: "public: __thiscall std::_Container_base12::_Container_base12(void)" (??0_Container_base12@std@@QAE@XZ) already defined in cryptlib.lib(cryptlib.obj) C:\Data\Work\C++ VS\CryptoTest\CryptoTest\msvcprtd.lib(MSVCP110D.dll) CryptoTest
Error 13 error LNK2005: "public: __thiscall std::_Container_base12::~_Container_base12(void)" (??1_Container_base12@std@@QAE@XZ) already defined in cryptlib.lib(cryptlib.obj) C:\Data\Work\C++ VS\CryptoTest\CryptoTest\msvcprtd.lib(MSVCP110D.dll) CryptoTest
Error 14 error LNK2005: "public: void __thiscall std::_Container_base12::_Orphan_all(void)" (?_Orphan_all@_Container_base12@std@@QAEXXZ) already defined in cryptlib.lib(cryptlib.obj) C:\Data\Work\C++ VS\CryptoTest\CryptoTest\msvcprtd.lib(MSVCP110D.dll) CryptoTest
Error 15 error LNK2005: "public: __thiscall std::locale::id::id(unsigned int)" (??0id@locale@std@@QAE@I@Z) already defined in cryptlib.lib(iterhash.obj) C:\Data\Work\C++ VS\CryptoTest\CryptoTest\msvcprtd.lib(MSVCP110D.dll) CryptoTest
Warning 16 warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library C:\Data\Work\C++ VS\CryptoTest\CryptoTest\LINK CryptoTest
Error 17 error LNK1169: one or more multiply defined symbols found C:\Data\Work\C++ VS\CryptoTest\Debug\CryptoTest.exe 1 1 CryptoTest
Код, который я пытался скомпилировать, был прост (я получил его с другого сайта):
#include <iostream>
#include <string>
#include "sha.h"
#include "hex.h"
using namespace std;
string SHA256(string data) {
byte const* pbData = (byte*) data.data();
unsigned int nDataLen = data.size();
byte abDigest[32];
CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);
return string((char*)abDigest);
}
int main(void) {
return 0;
}
Любые идеи, как это исправить? Мне сейчас действительно нужен только SHA-256, больше ничего. Я использую 64-разрядную версию Windows 7, и сегодня я скачал VS C ++, так что это должна быть самая новая версия.
VCUpgrade
. Вы видите симптомы сбоя VCUpgrade, о котором вам сообщили как об успехе .Ответы:
(На этот вопрос уже есть ответ в комментариях, но поскольку фактического ответа на него нет , я пишу это.)
Эта проблема возникает в более новых версиях Visual C ++ (более старые версии обычно просто связывали программу без уведомления, и она вылетала из строя и сгорала во время выполнения.) Это означает, что некоторые библиотеки, которые вы связываете с вашей программой (или даже некоторые из исходных кодов файлы внутри самой программы) используют разные версии CRT (библиотека C RunTime.)
Чтобы исправить эту ошибку, вам нужно зайти в свою
Project Properties
(и / или те из библиотек, которые вы используете), затем вC/C++
, затемCode Generation
и проверить значениеRuntime Library
; это должно быть одинаково для всех файлов и библиотек, которые вы связываете вместе. (Правила для связывания с библиотеками DLL немного более мягкие, но я не собираюсь здесь вдаваться в «почему» и более подробно.)В настоящее время существует четыре варианта этого параметра:
Ваша конкретная проблема, похоже, связана с тем, что вы связали библиотеку, созданную с помощью «Многопоточной отладки» (т. Е. Статической многопоточной отладочной CRT), с программой, которая создается с использованием параметра «Многопоточная отладка DLL » (то есть динамической многопоточной отладочной CRT). Вы должны изменить этот параметр либо в библиотеке, либо в вашей программе. А пока я предлагаю изменить это в вашей программе.
Обратите внимание, что, поскольку проекты Visual Studio используют разные наборы параметров проекта для отладочных и выпускных сборок (и 32/64-разрядных сборок), вы должны убедиться, что параметры совпадают во всех этих конфигурациях проекта.
Для (некоторой) дополнительной информации вы можете увидеть это (ссылка на комментарий выше):
ОБНОВЛЕНИЕ : (Это ответ на комментарий, в котором спрашивается, почему нужно проявлять такую осторожность.)
Если два фрагмента кода, которые мы связываем вместе, сами связываются со стандартной библиотекой и используют ее, то стандартная библиотека должна быть одинаковой для них обоих, если не уделяется особого внимания тому, как наши две части кода взаимодействуют и передают данные. Как правило, я бы сказал, что почти для всех ситуаций просто используйте одну и ту же версию среды выполнения стандартной библиотеки (в отношении отладки / выпуска, потоков и, очевидно, версии Visual C ++, среди прочего, таких как отладка итератора и т. Д.)
Самая важная часть проблемы заключается в следующем: иметь одинаковое представление о размере объектов по обе стороны от вызова функции .
Рассмотрим, например, что два вышеуказанных фрагмента кода называются
A
иB
. A скомпилирован для одной версии стандартной библиотеки, а B - для другой. В представлении A некоторый случайный объект, который ему возвращает стандартная функция (например, блок памяти, итератор,FILE
объект или что-то еще), имеет определенный размер и макет (помните, что макет структуры определяется и фиксируется во время компиляции в C / C ++.) По любой из нескольких причин представление B о размере / расположении одних и тех же объектов отличается (это может быть из-за дополнительной отладочной информации, естественной эволюции структур данных с течением времени и т. Д.)Теперь, если A вызывает стандартную библиотеку и возвращает объект, затем передает этот объект B, а B каким-либо образом касается этого объекта, есть вероятность, что B испортит этот объект (например, напишет неправильное поле или пропустит конец этого и т. д.)
Вышеупомянутые проблемы - не единственные, которые могут возникнуть. Внутренние глобальные или статические объекты в стандартной библиотеке также могут вызывать проблемы. Есть и более неясные классы проблем.
Все это становится еще более странным в некоторых аспектах при использовании DLL (динамической библиотеки времени выполнения) вместо библиотек (статической библиотеки времени выполнения).
Эта ситуация может применяться к любой библиотеке, используемой двумя частями кода, которые работают вместе, но стандартная библиотека используется большинством (если не почти всеми) программами, и это увеличивает шансы конфликта.
То, что я описал, очевидно, является разбавленной и упрощенной версией фактического беспорядка, который ждет вас, если вы смешаете версии библиотек. Надеюсь, это даст вам представление о том, почему вам не следует этого делать!
источник
Возможно, преобразование не было успешным. Единственное, что было успешным, - это запуск VCUpgrade. Само преобразование не удалось, но вы не узнаете об этом, пока не столкнетесь с обнаруженными вами ошибками. Некоторые подробности см. В Visual Studio на вики-странице Crypto ++.
Чтобы решить ваши проблемы, вы должны загрузить,
vs2010.zip
если вы хотите статическое связывание среды выполнения C / C ++ (/MT
или/MTd
), илиvs2010-dynamic.zip
если вы хотите динамическое связывание среды выполнения C / C ++ (/MT
или/MTd
). Оба исправляют скрытые, тихие сбои, производимые VCUpgrade.vs2010.zip
,vs2010-dynamic.zip
иvs2005-dynamic.zip
созданы из последних исходников GitHub . На момент написания этой статьи (1 июня 2016 г.) это фактически pre-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 циклов на байт по сравнению с 40 циклами на байт или около того для ванильного C / C ++.источник
У меня была эта проблема вместе с несоответствием в ITERATOR_DEBUG_LEVEL. Поскольку воскресная и вечерняя проблема все-таки казалась нормальной и подходящей для решения, я на какое-то время отключился. Работая в IDE VS2017 (обозреватель решений), я недавно добавил / скопировал ссылку на исходный файл в свой проект (перетаскивание с помощью Ctrl) из другого проекта. Заглянув в свойства-> C / C ++ / Preprocessor - на уровне исходного файла, а не на уровне проекта - я заметил, что в конфигурации выпуска _DEBUG был указан вместо NDEBUG для этого исходного файла. Это было все, что нужно было изменить, чтобы избавиться от проблемы.
источник
Проблема может быть решена путем добавления CRT файла msvcrtd.lib в библиотеку компоновщика. Потому что cryptlib.lib использует версию отладки CRT.
источник