No coincidencia detectada para ‘RuntimeLibrary’

Descargué y extraje Crypto ++ en C: \ cryptopp. Usé Visual Studio Express 2012 para construir todos los proyectos dentro (como se indica en el archivo léame), y todo se creó con éxito. Luego hice un proyecto de prueba en alguna otra carpeta y agregué cryptolib como una dependencia. Después de eso, agregué la ruta de inclusión para que pueda incluir fácilmente todos los encabezados. Cuando traté de comstackr, recibí un error sobre los símbolos no resueltos.

Para remediar eso, agregué C:\cryptopp\Win32\Output\Debug\cryptlib.lib para vincular dependencias adicionales. Ahora obtengo este error:

 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 

También recibo:

 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 

El código que intenté comstackr fue simple (lo obtuve de otro sitio):

 #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; } 

Alguna idea de cómo solucionar este problema? Realmente solo necesito SHA-256 en este momento, nada más. Estoy usando Windows 7 64 bit, y descargué VS C ++ hoy, así que debería ser la versión más nueva.

(Esto ya está respondido en los comentarios, pero como carece de una respuesta real, escribo esto).

Este problema surge en las versiones más nuevas de Visual C ++ (las versiones anteriores solían vincular silenciosamente el progtwig y se bloqueaba y quemaba en tiempo de ejecución). Esto significa que algunas de las bibliotecas que está enlazando con su progtwig (o incluso algunas de las fonts) archivos dentro de su propio progtwig) están usando diferentes versiones del CRT (la biblioteca C RunTime).

Para corregir este error, debe ir a las Project Properties (y / o las de las bibliotecas que está utilizando), luego a C/C++ , luego a Code Generation , y verificar el valor de la Runtime Library de Runtime Library de Runtime Library ; esto debería ser exactamente el mismo para todos los archivos y bibliotecas que está uniendo. (Las reglas son un poco más relajadas para enlazar con archivos DLL, pero no voy a entrar en el “por qué” y en más detalles aquí).

Actualmente hay cuatro opciones para esta configuración:

  1. Depuración multiproceso
  2. DLL de depuración multiproceso
  3. Versión multiproceso
  4. DLL de lanzamiento multiproceso

Su problema particular parece provenir de la vinculación de una biblioteca creada con “Depuración multiproceso” (es decir, CRT de depuración multiproceso estática) contra un progtwig que se está creando utilizando la configuración ” DLL de depuración múltiple” (es decir, CRT de depuración multiproceso dynamic). esta configuración en la biblioteca o en su progtwig. Por ahora, sugiero cambiar esto en su progtwig.

Tenga en cuenta que, dado que los proyectos de Visual Studio utilizan conjuntos diferentes de configuraciones de proyecto para comstackciones de depuración y liberación (y comstackciones de 32/64 bits), debe asegurarse de que las configuraciones coincidan en todas estas configuraciones de proyectos.

Para (algo) más información, puede ver estos (vinculados desde un comentario anterior):

  1. Linker Tools advierte LNK4098 en MSDN
  2. / MD, / ML, / MT, / LD (Usar biblioteca de tiempo de ejecución) en MSDN
  3. Errores de comstackción con VC11 Beta: la mezcla de las librerías MTd con MDD exes no se puede vincular en Bugzilla @ Mozilla

ACTUALIZACIÓN : (Esto es en respuesta a un comentario que pregunta por qué se debe tener mucho cuidado).

Si dos piezas de código que estamos uniendo entre sí se vinculan y utilizan la biblioteca estándar, la biblioteca estándar debe ser la misma para ambos, a menos que se tenga mucho cuidado con la forma en que nuestros dos elementos de código interactúan y pasan los datos. En general, diría que para casi todas las situaciones solo use la misma versión exacta del tiempo de ejecución de la biblioteca estándar (con respecto a depuración / publicación, hilos y, obviamente, la versión de Visual C ++, entre otras cosas, la depuración de iteradores, etc.)

La parte más importante del problema es esta: tener la misma idea sobre el tamaño de los objetos a cada lado de una llamada de función .

Considere por ejemplo que las dos piezas de código anteriores se llaman A y B A se comstack en una versión de la biblioteca estándar y B en otra. En la vista de A, algún objeto aleatorio que le devuelve una función estándar (por ejemplo, un bloque de memoria o un iterador o un objeto FILE o lo que sea) tiene un tamaño y diseño específicos (recuerde que el diseño de la estructura se determina y fija en tiempo de comstackción en C / C ++.) Por varias razones, la idea de B del tamaño / disposición de los mismos objetos es diferente (puede deberse a información adicional sobre depuración, evolución natural de las estructuras de datos a lo largo del tiempo, etc.)

Ahora, si A llama a la biblioteca estándar y recupera un objeto, luego pasa ese objeto a B, y B toca ese objeto de cualquier manera, es probable que B arruine ese objeto (ej. Escriba el campo incorrecto, o pase el final de eso, etc.)

Lo anterior no es el único tipo de problemas que pueden suceder. Los objetos internos globales o estáticos en la biblioteca estándar también pueden causar problemas. Y también hay clases más oscuras de problemas.

Todo esto se vuelve más extraño en algunos aspectos cuando se usan DLL (biblioteca de tiempo de ejecución dinámica) en lugar de bibliotecas (biblioteca de tiempo de ejecución estática).

Esta situación puede aplicarse a cualquier biblioteca utilizada por dos piezas de código que funcionan juntas, pero la mayoría de las bibliotecas (si no casi todas) utilizan la biblioteca estándar y eso aumenta las posibilidades de conflicto.

Lo que describí es obviamente una versión simplificada y diluida del desorden real que te espera si mezclas versiones de la biblioteca. ¡Espero que te dé una idea de por qué no deberías hacerlo!

Descargué y extraje Crypto ++ en C: \ cryptopp. Usé Visual Studio Express 2012 para construir todos los proyectos dentro (como se indica en el archivo Léame), y todo se creó con éxito. Luego hice un proyecto de prueba en alguna otra carpeta y agregué cryptolib como una dependencia.

La conversión probablemente no fue exitosa. Lo único que tuvo éxito fue la ejecución de VCUpgrade. La conversión real en sí falló pero no lo sabe hasta que experimenta los errores que está viendo. Para algunos de los detalles, vea Visual Studio en la wiki de Crypto ++.


Alguna idea de cómo solucionar este problema?

Para resolver sus problemas, debe descargar vs2010.zip si desea un enlace de tiempo de ejecución C / C ++ estático ( /MT o /MTd ), o vs2010-dynamic.zip si desea un enlace dynamic en tiempo de ejecución de C / C ++ ( /MT o /MTd ) . Ambos arreglan las fallas latentes y silenciosas producidas por VCUpgrade.


vs2010.zip , vs2010-dynamic.zip y vs2005-dynamic.zip se crean a partir de las últimas fonts de GitHub . A partir de este escrito (JUN 1 2016), eso es efectivamente pre-Crypto ++ 5.6.4. Si está utilizando los archivos ZIP con un nivel inferior de Crypto ++, como 5.6.2 o 5.6.3, entonces se encontrará con problemas menores.

Hay dos problemas menores de los que soy consciente. Primero es un cambio de nombre de bench.cpp a bench1.cpp . Su error es:

  • 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)

La solución es (1) abrir cryptest.vcxproj en el bloc de notas, buscar bench1.cpp y luego cambiarle el nombre a bench.cpp . O (2) cambie el nombre de bench.cpp a bench1.cpp en el sistema de archivos. Por favor, no elimine este archivo.

El segundo problema es un poco más complicado porque es un objective móvil. Las versiones de nivel inferior, como 5.6.2 o 5.6.3, faltan las últimas clases disponibles en GitHub . Los archivos de clase faltantes incluyen HKDF (5.6.3), RDRAND (5.6.3), RDSEED (5.6.3), ChaCha (5.6.4), BLAKE2 (5.6.4), Poly1305 (5.6.4), etc.

La solución es eliminar los archivos fuente faltantes de los archivos de proyecto de Visual Studio, ya que no existen para las versiones de nivel inferior.

Otra opción es agregar los archivos de clase faltantes de las últimas fonts, pero podría haber complicaciones. Por ejemplo, muchas de las fonts sutilmente dependen de las últimas config.h , cpu.h y cpu.cpp . La “sutileza” es que no se dará cuenta de que está obteniendo una clase de bajo rendimiento.

Un ejemplo de clase de bajo rendimiento es BLAKE2. config.h agrega tiempo de comstackción ARM-32 y detección ARM-64. cpu.h y cpu.cpp agregan la detección de instrucción ARM en tiempo de ejecución, que depende de la detección del tiempo de comstackción. Si agrega BLAKE2 sin los otros archivos, entonces no se produce ninguna detección y obtiene una implementación directa de C / C ++. Probablemente no te des cuenta de que te está faltando la oportunidad NEON, que corre de 9 a 12 ciclos por byte frente a 40 ciclos por byte más o menos para C / C ++ vainilla.

Tuve este problema junto con la falta de coincidencia en ITERATOR_DEBUG_LEVEL. Como el problema de los domingos por la noche, después de todo, parecía estar bien y estaba bien, me dejaron fuera por un tiempo. Trabajando en IDE de VS2017 (Solution Explorer) Recientemente agregué / copié una referencia de archivo fuente a mi proyecto (ctrl-drag) de otro proyecto. Examinando las propiedades-> C / C ++ / Preprocesador – en el nivel de archivo fuente, no en el nivel del proyecto – noté que en una configuración de Versión se había especificado DEBUG en lugar de NDEBUG para este archivo fuente. Que fue todo el cambio necesario para deshacerse del problema.