Обнаружено несоответствие для "RuntimeLibrary"
Я загрузил и извлек Crypto++ в C:cryptopp - ... Я использовал Visual Studio Express 2012 для создания всех проектов внутри (как указано в readme), и все было построено успешно. Затем я сделал тестовый проект в какой-то другой папке и добавил cryptolib в качестве зависимости. После этого я добавил путь включения, чтобы я мог легко включить все заголовки. Когда я попытался скомпилировать, я получил ошибку о неразрешенных символах.
чтобы исправить это, я добавил C:cryptoppWin32OutputDebugcryptlib.lib
перейти по ссылке Дополнительные зависимости. Теперь я получаю эту ошибку:
Error 1 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestmsvcprtd.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:DataWorkC++ VSCryptoTestCryptoTestmsvcprtd.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:DataWorkC++ VSCryptoTestCryptoTestmsvcprtd.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:DataWorkC++ VSCryptoTestCryptoTestmsvcprtd.lib(MSVCP110D.dll) CryptoTest
Warning 16 warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library C:DataWorkC++ VSCryptoTestCryptoTestLINK CryptoTest
Error 17 error LNK1169: one or more multiply defined symbols found C:DataWorkC++ VSCryptoTestDebugCryptoTest.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 прямо сейчас, ничего больше. Я использую Windows 7 64 бит, и я загрузил VS C++ сегодня, поэтому он должен быть новейшей версией.
3 ответов
(на это уже ответили в комментариях, но так как ему не хватает фактического ответ, Я пишу это.)
эта проблема возникает в новых версиях Visual C++ (старые версии обычно просто молча связывают программу, и она будет аварийно завершать работу во время выполнения.) Это означает, что некоторые из библиотек, которые вы связываете с вашей программой (или даже некоторые исходные файлы внутри самой программы) являются использование различных версий CRT (среда выполнения C библиотека.)
чтобы исправить эту ошибку, нужно зайти в свой Project Properties
(и/или библиотеки, которые вы используете), затем в C/C++
, потом Code Generation
, и проверьте значение Runtime Library
; это должно быть точно так же для все файлы и библиотеки, которые вы связываете вместе. (Правила немного более расслабленным для связывания с DLL, но я не собираюсь вдаваться в "почему" и более подробно здесь.)
в настоящее время существует четыре варианта для Эта настройка:
- Отладка Многопоточных
- многопоточная отладка DLL
- Многопоточная Версия
- многопоточный релиз DLL
ваша конкретная проблема, похоже, связана с тем, что вы связываете библиотеку, построенную с " многопоточным отладчиком "(т. е. статическим многопоточным отладчиком CRT), с программой, которая строится с использованием " многопоточного отладки DLL" настройка (т. е. динамическая многопоточная отладка ЭЛТ.) Вы следует изменить этот параметр либо в библиотеке, либо в вашей программе. На данный момент я предлагаю изменить это в вашей программе.
обратите внимание, что поскольку проекты Visual Studio используют различные наборы параметров проекта для отладочных и выпускных сборок (и 32/64-разрядных сборок), необходимо убедиться, что параметры совпадают во всех этих конфигурациях проекта.
для (некоторых) дополнительной информации вы можете увидеть эти (связанные с комментарием выше):
- Инструменты Линкер Предупреждение LNK4098 на MSDN
- / MD, / ML, /MT, / LD (используйте библиотеку времени выполнения) на MSDN
- Build ошибки с Vc11 бета-смешивания MTD libs с MDd exes не удается связать на Bugzilla@Mozilla
обновление: (это в ответ на комментарий, который спрашивает по причине того, что это должно быть сделано.)
если две части кода, которые мы связываем вместе, сами связываются против и используя стандартную библиотеку, то стандартная библиотека должна быть одинаковой для них обоих, если большой забота о том, как наши две части кода взаимодействуют и передают данные. Как правило, я бы сказал, что почти для всех ситуаций просто используйте одну и ту же версию стандартной библиотеки времени выполнения (в отношении отладки/выпуска, потоков и, очевидно, версии Visual C++, среди прочего, как отладка итератора и т. д.)
самая важная часть проблемы это: имея ту же идею о размере объектов по обе стороны вызова функции.
рассмотрим, например, что вышеупомянутые две части кода называются A
и B
. А составлен против одной версии стандартной библиотеки и B против другой. По мнению A, некоторый случайный объект, который возвращает ему стандартная функция (например, блок памяти или итератор или FILE
объект или что-то еще) имеет определенный размер и макет (помните, что макет структуры определяется и фиксируется во время компиляции в C/C++.) По любой из нескольких причин представление B о размере / компоновке одних и тех же объектов отличается (это может быть из-за дополнительной отладочной информации, естественной эволюции структур данных с течением времени и т. д.)
теперь, если A вызывает стандартную библиотеку и возвращает объект, а затем передает этот объект в B, и B касается этого объекта каким-либо образом, скорее всего, B испортит этот объект (например, напишите неправильное поле, или после его окончания и т. д.)
выше не единственный вид проблем, которые могут произойти. Внутренние глобальные или статические объекты в стандартной библиотеке также могут вызвать проблемы. И есть более неясные классы проблем.
все это становится более странным в некоторых аспектах при использовании DLL (динамическая библиотека времени выполнения) вместо libs (статическая библиотека времени выполнения.)
эта ситуация может применяться к любой библиотеке, используемой двумя частями кода, которые работают вместе, но стандартная библиотека используется большинством (если не почти всеми) программ, и это увеличивает шансы столкновения.
то, что я описал, очевидно, разбавленная и упрощенная версия фактического беспорядка, который ждет вас, если вы смешиваете версии библиотеки. Я надеюсь, что это дает вам представление о том, почему вы не должны этого делать!
я загрузил и извлек Crypto++ в C:\cryptopp - ... Я использовал Visual Studio Express 2012 для создания всех проектов внутри (как указано в readme), и все было построено успешно. Затем я сделал тестовый проект в какой-то другой папке и добавил cryptolib в качестве зависимости.
преобразование, вероятно, не было успешным. Единственное, что было успешным, это запуск 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-файлы с крипто++ нижнего уровня, как 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)" (?OutputResultOperations@@YAXPBD0_NKN@Z)
исправление состоит в том, чтобы либо (1) открыть cryptest.vcxproj
в блокноте, найдите bench1.cpp
, а затем переименуйте его в bench.cpp
. Или (2) переименовать bench.cpp
to 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 циклов на байт или около того для vanilla C/C++.
Я имел эту проблему с несовпадением ITERATOR_DEBUG_LEVEL. Поскольку проблема воскресного вечера в конце концов казалась нормальной и хорошей, я был расстроен на некоторое время. Работая в DE VS2017 IDE (Solution Explorer), я недавно добавил/скопировал ссылку на исходный файл моего проекта (ctrl-drag) из другого проекта. Просмотр свойств - >C/C++ / препроцессор -на уровне исходного файла, а не на уровне проекта - Я заметил, что в конфигурации выпуска _DEBUG был указан вместо NDEBUG для этого исходного файла. Этого было достаточно, чтобы избавиться от проблемы.