‘RuntimeLibrary’에 대한 불일치 감지 C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(filters.obj) CryptoTest Error 9

C : \ cryptopp에서 Crypto ++를 다운로드하고 추출했습니다. 필자는 Visual Studio Express 2012를 사용하여 모든 프로젝트를 내부에서 빌드했고 (readme에서 지시 한대로) 모든 것이 성공적으로 빌드되었습니다. 그런 다음 다른 폴더에 테스트 프로젝트를 만들고 cryptolib를 종속성으로 추가했습니다. 그 후 모든 헤더를 쉽게 포함 할 수 있도록 포함 경로를 추가했습니다. 컴파일을 시도 할 때 해결되지 않은 기호에 대한 오류가 발생했습니다.

이를 해결하기 위해 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)" (??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

컴파일하려는 코드는 간단했습니다 (다른 사이트에서 얻었습니다).

#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 ++를 다운로드 했으므로 최신 버전이어야합니다.



답변

(이미 댓글로 답변을 받았지만 실제 답변 이 없기 때문에이 글을 쓰고 있습니다.)

이 문제는 Visual C ++의 최신 버전에서 발생합니다 (이전 버전은 일반적으로 프로그램을 자동으로 연결하고 런타임에 충돌 및 레코딩됩니다.) 이는 프로그램과 연결하는 일부 라이브러리 (또는 일부 소스 프로그램 내부의 파일)이 다른 버전의 CRT (C RunTime 라이브러리)를 사용하고 있습니다.

이 오류를 수정하려면 Project Properties사용중인 라이브러리 (및 / 또는 사용중인 라이브러리)로 이동 한 다음 C/C++,으로 이동 한 다음 Code Generation의 값을 확인해야합니다 Runtime Library. 이것은 함께 연결하는 모든 파일과 라이브러리에 대해 정확히 동일해야합니다 . (규칙은 DLL과의 연결에 대해 좀 더 완화되어 있지만 “이유”와 여기에서 자세한 내용은 다루지 않겠습니다.)

현재이 설정에는 네 가지 옵션이 있습니다.

  1. 다중 스레드 디버그
  2. 다중 스레드 디버그 DLL
  3. 다중 스레드 릴리스
  4. 다중 스레드 릴리스 DLL

귀하의 특별한 문제는 당신이 “다중 스레드 디버그 사용하여 구축중인 프로그램에 대해”다중 스레드 디버그 “(즉, 정적 멀티 스레드 디버그 CRT)에 내장 된 라이브러리 링크에서 줄기 것 같다 DLL 설정”(즉, 동적 멀티 스레드 디버그 CRT를.) 당신은 변경해야 라이브러리 또는 프로그램에서이 설정. 지금은 프로그램에서이를 변경하는 것이 좋습니다.

Visual Studio 프로젝트는 디버그 및 릴리스 빌드 (및 32/64 비트 빌드)에 대해 서로 다른 프로젝트 설정 집합을 사용하므로 이러한 모든 프로젝트 구성에서 설정이 일치하는지 확인해야합니다.

(일부) 자세한 정보는 다음을 볼 수 있습니다 (위의 주석에서 링크 됨).

  1. 링커 도구 경고 LNK4098MSDN의
  2. MSDN의 / MD, / ML, / MT, / LD (런타임 라이브러리 사용)
  3. VC11 베타에서 빌드 오류-MTd libs와 MDd exes를 혼합하면 Bugzilla @ Mozilla 에서 링크되지 않습니다.

UPDATE : (이렇게주의를 기울여야하는 이유를 묻는 댓글에 대한 답변입니다.)

우리가 함께 연결하는 자체에 연결하는 표준 라이브러리를 사용하여 해당 코드의 두 조각, 다음, 표준 라이브러리하지 않는 한, 둘 다에 대해 동일해야합니다 경우 주의를 우리의 두 개의 코드 조각은 상호 작용과 데이터를 주위에 전달하는 방법에 대해 취해진 다. 일반적으로 거의 모든 상황에서 표준 라이브러리 런타임의 똑같은 버전을 사용한다고 말하고 싶습니다 (디버그 / 릴리스, 스레드 및 분명히 Visual C ++ 버전과 관련하여 반복기 디버깅 등).

문제의 가장 중요한 부분은 이것이다 : 함수 호출의 양쪽에있는 객체의 크기에 대해 동일한 아이디어를 갖는 것 입니다.

예를 들어 위의 두 가지 코드가 Aand B. A는 표준 라이브러리의 한 버전에 대해 컴파일 되고 B는 다른 버전에 대해 컴파일 됩니다. A의 관점에서 표준 함수가 반환하는 임의의 객체 (예 : 메모리 블록, 반복기 또는 FILE객체 등)에는 특정 크기와 레이아웃이 있습니다 (구조 레이아웃은 C /에서 컴파일 타임에 결정되고 고정됨을 기억하십시오). C ++.) 여러 가지 이유로, 동일한 객체의 크기 / 레이아웃에 대한 B의 생각은 다릅니다 (추가 디버그 정보, 시간에 따른 데이터 구조의 자연스러운 진화 등으로 인해 발생할 수 있음).

이제 A가 표준 라이브러리를 호출하고 개체를 다시 가져온 다음 해당 개체를 B에 전달하고 B가 어떤 식 으로든 해당 개체에 닿으면 B가 해당 개체를 엉망으로 만들 가능성이 있습니다 (예 : 잘못된 필드를 작성하거나 끝을지나 그것의 등)

위의 문제가 발생할 수있는 유일한 문제는 아닙니다. 표준 라이브러리의 내부 전역 또는 정적 개체도 문제를 일으킬 수 있습니다. 그리고 더 모호한 문제도 있습니다.

libs (정적 런타임 라이브러리) 대신 DLL (동적 런타임 라이브러리)을 사용할 때이 모든 것이 일부 측면에서 더 이상해집니다.

이 상황은 함께 작동하는 두 개의 코드 조각에서 사용하는 모든 라이브러리에 적용될 수 있지만 표준 라이브러리는 대부분의 (거의 전부는 아니지만) 프로그램에서 사용되므로 충돌 가능성이 높아집니다.

내가 설명한 것은 분명히 라이브러리 버전을 혼합 할 때 당신을 기다리는 실제 혼란의 물이 적고 단순화 된 버전입니다. 나는 그것이 당신이 그것을하지 말아야하는 이유에 대한 아이디어를 제공하기를 바랍니다!


답변

C : \ cryptopp에서 Crypto ++를 다운로드하고 추출했습니다. 필자는 Visual Studio Express 2012를 사용하여 모든 프로젝트를 내부에서 빌드했고 (readme에서 지시 한대로) 모든 것이 성공적으로 빌드되었습니다. 그런 다음 다른 폴더에 테스트 프로젝트를 만들고 cryptolib를 종속성으로 추가했습니다.

변환이 성공하지 못했을 것입니다. 성공한 유일한 것은 VCUpgrade의 실행이었습니다. 실제 변환 자체는 실패했지만 표시되는 오류가 발생할 때까지 알 수 없습니다. 일부 세부 정보 는 Crypto ++ 위키의 Visual Studio 를 참조하세요 .


이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

문제를 해결하려면 vs2010.zip정적 C / C ++ 런타임 링크 ( /MT또는 /MTd)를 원하거나 vs2010-dynamic.zip동적 C / C ++ 런타임 링크 ( /MT또는 /MTd) 를 원할 경우 다운로드 해야합니다 . 둘 다 VCUpgrade에 의해 생성 된 잠재적이고 조용한 오류를 수정합니다.


vs2010.zip, vs2010-dynamic.zip그리고 최신 GitHub 소스vs2005-dynamic.zip 에서 빌드되었습니다 . 이 글을 쓰는 시점 (2016 년 6 월 1 일), 이는 사실상 Crypto ++ 5.6.4 이전 버전입니다. 5.6.2 또는 5.6.3과 같은 하위 수준 Crypto ++로 ZIP 파일을 사용하는 경우 사소한 문제가 발생합니다.

내가 알고있는 두 가지 사소한 문제가 있습니다. 첫 번째는 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.hcpu.cpp. “미묘함”은 당신이 성과가 저조한 수업을 받고 있다는 것을 깨닫지 못할 것입니다.

실적이 저조한 클래스의 예는 BLAKE2입니다. config.h컴파일 시간 ARM-32 및 ARM-64 감지를 추가합니다. cpu.hcpu.cpp컴파일 시간 감지에 따라 달라 런타임 ARM 명령어 감지 기능을 추가합니다. 다른 파일없이 BLAKE2를 추가하면 탐지가 발생하지 않고 곧바로 C / C ++ 구현이됩니다. 바닐라 C / C ++의 경우 바이트 당 40 사이클 정도에 비해 바이트 당 9-12 사이클 정도 실행되는 NEON 기회를 놓치고 있다는 사실을 깨닫지 못할 것입니다.


답변

ITERATOR_DEBUG_LEVEL의 불일치와 함께이 문제가 발생했습니다. 결국 일요일 저녁 문제가 괜찮아 보이고 좋은 것 같았 기 때문에 나는 한동안 밖으로 나갔다. VS2017 IDE (솔루션 탐색기)에서 작업하기 최근에 다른 프로젝트에서 내 프로젝트에 대한 소스 파일 참조를 추가 / 복사했습니다 (ctrl-drag). 프로젝트 수준이 아닌 소스 파일 수준에서 속성-> C / C ++ / 전처리기를 살펴보면 릴리스 구성에서이 소스 파일에 대해 NDEBUG 대신 _DEBUG가 지정되었음을 알았습니다. 문제를 해결하는 데 필요한 모든 변화였습니다.


답변

링커 라이브러리에 msvcrtd.lib의 CRT를 추가하여 문제를 해결할 수 있습니다. cryptlib.lib는 CRT 버전의 디버그를 사용했기 때문입니다.