Несоответствия обнаруживаются для динамических ресурсов'



Я загрузил и извлек 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++ сегодня, поэтому это должна быть самая новая версия.

673   3  

3 ответов:

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

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

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

в настоящее время существует четыре варианта для Эта настройка:

  1. Отладка Многопоточных
  2. многопоточная отладка DLL
  3. Многопоточная Версия
  4. многопоточный релиз DLL

ваша конкретная проблема, похоже, связана с тем, что вы связываете библиотеку, построенную с помощью " многопоточной отладки "(т. е. статической многопоточной отладки CRT), с программой, которая строится с использованием " многопоточной отладки DLL" настройка (т. е. динамическая многопоточная отладка ЭЛТ.) Вы следует изменить этот параметр либо в библиотеке, либо в вашей программе. На данный момент, я предлагаю изменить это в вашей программе.

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

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

  1. Инструменты Линкер Предупреждение LNK4098 на MSDN
  2. /MD, / ML, /MT, / LD (использовать библиотеку времени выполнения) на MSDN
  3. ошибки сборки с Vc11 Beta-mixing MTd libs с MDD exes не удается связать на Bugzilla@Mozilla

обновление: (это в ответ на комментарий, который спрашивает о причине, по которой эта большая забота должна быть предпринята.)

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

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

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

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

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

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

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

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

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

преобразование, вероятно, не было успешным. Единственное, что было успешным, это запуск VCUpgrade. Фактическое преобразование само по себе не удалось, но вы не знаете, пока вы опыт, ошибки, которые вы видите. Некоторые подробности см. В разделе Visual Studio на Crypto++ wiki.


есть идеи, как это исправить?

решить ваши проблемы, вы должны скачать vs2010.zip если вы хотите статический C / C++ runtime linking (/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 добавляет обнаружение инструкции runtime ARM, которое зависит от обнаружения времени компиляции. Если вы добавляете BLAKE2 без других файлов, то ни одно из обнаружений не происходит, и вы получаете прямую реализацию C/C++. Вы, вероятно, не будете поймите, что вам не хватает возможности NEON, которая работает от 9 до 12 циклов на байт против 40 циклов на байт или около того для vanilla C/C++.

У меня была эта проблема вместе с несоответствием в ITERATOR_DEBUG_LEVEL. Поскольку проблема воскресного вечера в конце концов казалась нормальной и хорошей, я был выведен на некоторое время. Работая в среде de VS2017 IDE (Обозреватель решений), я недавно добавил/скопировал ссылку на исходный файл моего проекта (ctrl-drag) из другого проекта. Глядя в свойства - >C/C++ / препроцессор -на уровне исходного файла, а не на уровне проекта - Я заметил, что в конфигурации релиза _DEBUG был указан вместо NDEBUG для этого исходного файла. Это были все изменения, необходимые, чтобы избавиться от проблемы.

Comments

    Ничего не найдено.