Несоответствие обнаружено для ‘RuntimeLibrary’

Я загрузил и извлек Crypto ++ в C: \ cryptopp. Я использовал Visual Studio Express 2012 для создания всех проектов внутри (как указано в readme), и все было успешно построено. Затем я сделал тестовый проект в другой папке и добавил криптолиб в качестве зависимости. После этого я добавил путь включения, чтобы я мог легко включать все заголовки. Когда я попытался скомпилировать, у меня возникла ошибка в отношении неразрешенных символов.

Чтобы исправить это, я добавил 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)" ([email protected]@@[email protected]) 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)" ([email protected]@@[email protected]) 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)" ([email protected][email protected]@@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)" ([email protected]@[email protected]@[email protected]@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  #include  #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 ++, поэтому она должна быть самой новой версией.

(Это уже ответили в комментариях, но поскольку у него нет фактического ответа , я пишу это.)

Эта проблема возникает в более новых версиях Visual C ++ (более старые версии обычно просто молчали связаны с программой, и она будет разбиваться и записываться во время выполнения.) Это означает, что некоторые из библиотек, которые вы связываете с вашей программой (или даже некоторыми источниками файлы внутри самой программы) используют разные версии CRT (библиотека C RunTime).

Чтобы исправить эту ошибку, вам нужно зайти в свои Project Properties (и / или те из библиотек, которые вы используете), затем в C/C++ , затем Code Generation и проверить значение Runtime Library ; это должно быть точно таким же для всех файлов и библиотек, которые вы связываете вместе. (Правила немного смягчены для связи с DLL, но я не собираюсь вдаваться в «почему» и более подробно здесь).

В настоящее время существует четыре параметра для этого параметра:

  1. Многопоточная отладка
  2. Многопоточная отладка DLL
  3. Многопоточный выпуск
  4. Многопоточная версия DLL

Ваша конкретная проблема, по-видимому, связана с тем, что вы связываете библиотеку, построенную с помощью «многоstreamовой отладки» (то есть статический многоstreamовый отладочный CRT), против программы, которая строится с использованием параметра «Многопоточная отладка DLL » (т. Е. Динамический многопоточный отладочный CRT). Вы должны изменить этот параметр либо в библиотеке, либо в вашей программе. Пока я предлагаю изменить это в вашей программе.

Обратите внимание, что, поскольку проекты Visual Studio используют разные наборы параметров проекта для отладочных и выпускных сборок (и 32/64-битные сборки), вы должны убедиться, что параметры совпадают во всех этих конфигурациях проекта.

Для (некоторых) дополнительной информации вы можете видеть их (связанные с комментарием выше):

  1. Средства Linker Tools Предупреждение LNK4098 на MSDN
  2. / MD, / ML, / MT, / LD (Использовать библиотеку времени выполнения) в MSDN
  3. Построить ошибки с помощью VC11 Beta – смешение файлов MTd с MDd exes не связано с Bugzilla @ Mozilla

ОБНОВЛЕНИЕ : (Это в ответ на комментарий, в котором говорится о причине, что эта большая осторожность должна быть предпринята.)

Если два fragmentа кода, которые мы связываем вместе, сами соединяются и используют стандартную библиотеку, то стандартная библиотека должна быть одинаковой для обеих из них, если не будет особо осторожно относиться к тому, как наши два fragmentа кода взаимодействуют и передают данные. Как правило, я бы сказал, что почти во всех ситуациях просто используйте ту же самую версию стандартной среды исполнения библиотеки (относительно отладки / выпуска, streamов и, очевидно, версии Visual C ++, среди прочего, таких как отладка iteratorа и т. Д.),

Самая важная часть проблемы заключается в следующем: имея ту же идею о размере объектов по обе стороны вызова функции .

Рассмотрим, например, что эти две части кода называются A и B A скомпилирован против одной версии стандартной библиотеки, а B – другой. В представлении А некоторый случайный объект, возвращаемый к нему стандартной функцией (например, блок памяти или iterator или объект FILE или что-то еще), имеет определенный размер и макет (помните, что структура структуры определяется и фиксируется во время компиляции в C / C ++.) По любой из причин идея B о размере / компоновке одних и тех же объектов различна (это может быть связано с дополнительной информацией отладки, естественной эволюцией структур данных с течением времени и т. Д.),

Теперь, если A вызывает стандартную библиотеку и возвращает объект обратно, то передает этот объект в B, и B каким-либо образом затрагивает этот объект, скорее всего, B будет помешать этому объекту (например, написать неправильное поле или за конец его и т. д.)

Вышеизложенное не является единственным видом проблем, которые могут произойти. Внутренние глобальные или статические объекты в стандартной библиотеке также могут вызвать проблемы. И есть еще более неясные classы проблем.

Все это становится более странным в некоторых аспектах при использовании DLL (динамической библиотеки времени выполнения) вместо libs (статическая библиотека времени выполнения).

Эта ситуация может относиться к любой библиотеке, используемой двумя fragmentами кода, которые работают вместе, но стандартная библиотека используется большинством (если не почти всех) программ и увеличивает шансы столкновения.

То, что я описал, очевидно, представляет собой ошпаренную и упрощенную версию фактического беспорядка, который ждет вас, если вы смешиваете версии библиотеки. Я надеюсь, что это даст вам представление о том, почему вы не должны этого делать!

Я загрузил и извлек Crypto ++ в C: \ cryptopp. Я использовал Visual Studio Express 2012 для создания всех проектов внутри (как указано в readme), и все было успешно построено. Затем я сделал тестовый проект в другой папке и добавил криптолиб в качестве зависимости.

Преобразование, вероятно, не было успешным. Единственное, что было успешным, – это запуск 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 . Начиная с этой записи (JUN 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)" ([email protected]@[email protected])

Исправление состоит в том, чтобы либо (1) открыть cryptest.vcxproj в блокноте, найти bench1.cpp , а затем переименовать его на bench.cpp . Или (2) переименуйте bench.cpp в bench1.cpp в файловой системе. Не удаляйте этот файл.

Вторая проблема немного сложнее, потому что ее движущаяся цель. В версиях Down level, таких как 5.6.2 или 5.6.3, отсутствуют последние classы, доступные в GitHub . Недопустимые файлы classов include 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, поскольку они не существуют для выпусков нижнего уровня.

Другой вариант – добавить отсутствующие файлы classов из последних источников, но могут быть сложности. Например, многие источники изящно зависят от последних cpu.h , cpu.h и cpu.cpp . «Утонченность» заключается в том, что вы не поймете, что вы получаете недостаточно эффективный class.

Примером неполного classа является 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 (Solution Explorer), я недавно добавил / скопировал ссылку на исходный файл для моего проекта (ctrl-drag) из другого проекта. В свойствах-> C / C ++ / Preprocessor – на уровне исходного файла, а не на уровне проекта. Я заметил, что в конфигурации Release вместо этого NDEBUG был указан _DEBUG для этого исходного файла. Который был все изменения, необходимые, чтобы избавиться от проблемы.

  • #ifdef #ifndef в Java
  • Scala double definition (2 метода имеют стирание того же типа)
  • Как определить версию приложения в одном месте для нескольких приложений?
  • Как Eclipse компилирует classы только с JRE?
  • Профилирование процесса компиляции C ++
  • Компилировать код с помощью JavaFX 2.0 (используя командную строку)
  • Сохранение имен параметров / аргументов в скомпилированных java-classах
  • Как скомпилировать приложение Python 3 в .exe?
  • C ++, объявление переменной в выражении 'if'
  • Можно ли компилировать и выполнять новый код во время выполнения в .NET?
  • Статические конечные значения Java заменяются в коде при компиляции?
  • Interesting Posts

    Как получить доступ к параметрам в параметризованной сборке?

    Систематические атаки на несколько сервисов и портов (получение NAT) на хобби-сервере

    Заполнение ListView с помощью ArrayList?

    Objective-C разметка шестнадцатеричной строки для целого числа

    Может ли общий барабанный блок вызвать загрязнение принтера Brother HL-2170w Laser B & W?

    Преобразование разделенной запятой строки в массив в PL / SQL

    Windows 7 Explorer: как показать общий размер всех файлов в текущей папке?

    Получать глобальный цвет оттенка из кода

    Звук иногда не работает для некоторых программ в Windows 7, даже из диалога Mixer

    Значит ли размер указателей в C?

    Просмотр полных строк при отладке в Eclipse

    Неужели мой жесткий диск неисправен?

    Поддержка двух мониторов для ASUS M4A785TD-V EVO

    PM: изображение спящего режима отсутствует или не может быть загружено

    Добавление пользовательских заголовков в запросы ресурсов WebView – андроид

    Давайте будем гением компьютера.