c++ - No coincidencia detectada para ''RuntimeLibrary''
hash compilation (2)
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 compilar, 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é compilar fue simple (lo obtuve de otro sitio):
#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;
}
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.
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.zip si desea un enlace dinámico en tiempo de ejecución de C / C ++ ( /MT
o /MTd
) . Ambos arreglan las fallas latentes y silenciosas producidas por VCUpgrade.
vs2010.zip
, vs2010.zip y vs2010.zip se crean a partir de las últimas fuentes 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 objetivo 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 fuentes, pero podría haber complicaciones. Por ejemplo, muchas de las fuentes 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 compilació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 compilació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.
(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 programa y se bloqueaba y quemaba en tiempo de ejecución). Esto significa que algunas de las bibliotecas que está enlazando con su programa (o incluso algunas de las fuentes) archivos dentro de su propio programa) 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:
- Depuración multiproceso
- DLL de depuración multiproceso
- Versión multiproceso
- 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 programa que se está creando utilizando la configuración " DLL de depuración múltiple" (es decir, CRT de depuración multiproceso dinámico). esta configuración en la biblioteca o en su programa. Por ahora, sugiero cambiar esto en su programa.
Tenga en cuenta que, dado que los proyectos de Visual Studio utilizan conjuntos diferentes de configuraciones de proyecto para compilaciones de depuración y liberación (y compilaciones 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):
- Linker Tools advierte LNK4098 en MSDN
- / MD, / ML, / MT, / LD (Usar biblioteca de tiempo de ejecución) en MSDN
- bugzilla.mozilla.org/show_bug.cgi?id=732124 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 compila 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 compilació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!