ตรวจพบไม่ตรงกันสำหรับ 'RuntimeLibrary'


114

ฉันดาวน์โหลดและแตก Crypto ++ ใน C: \ cryptopp ฉันใช้ 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 ++ ในวันนี้ดังนั้นควรเป็นเวอร์ชันใหม่ล่าสุด



1
ฉันตั้งค่าไลบรารีรันไทม์ของโปรเจ็กต์เป็น Multi-threaded debug (นั่นคือการตั้งค่าที่ใช้ใน crypto ++) และตอนนี้ก็คอมไพล์แล้ว! :) ขอบคุณมาก.
Momonga

VCUpgradeปัญหาที่เกิดขึ้นมากก่อนหน้านี้เมื่อคุณวิ่ง คุณกำลังเห็นอาการของความล้มเหลว VCUpgrade ที่รายงานว่าเป็นความสำเร็จสำหรับคุณ
jww

คำตอบ:


234

(นี่เป็นคำตอบแล้วในความคิดเห็น แต่เนื่องจากไม่มีคำตอบที่แท้จริงฉันจึงเขียนสิ่งนี้)

ปัญหานี้เกิดขึ้นใน Visual C ++ เวอร์ชันใหม่กว่า (โดยทั่วไปแล้วเวอร์ชันเก่าจะเชื่อมโยงโปรแกรมแบบเงียบ ๆ และอาจเกิดปัญหาและเบิร์นในขณะรัน) หมายความว่าไลบรารีบางส่วนที่คุณกำลังเชื่อมโยงกับโปรแกรมของคุณ (หรือแม้แต่แหล่งที่มาบางส่วน ไฟล์ภายในโปรแกรมของคุณเอง) กำลังใช้ CRT เวอร์ชันต่างๆ (ไลบรารี C RunTime)

ในการแก้ไขข้อผิดพลาดนี้คุณต้องเข้าไปในProject Properties(และ / หรือไลบรารีที่คุณใช้) จากนั้นเข้าไปในC/C++จากนั้นCode Generationตรวจสอบค่าของRuntime Library; สิ่งนี้ควรจะเหมือนกันทุกประการสำหรับไฟล์และไลบรารีทั้งหมดที่คุณกำลังเชื่อมโยงเข้าด้วยกัน (กฎจะผ่อนคลายกว่าเล็กน้อยสำหรับการเชื่อมโยงกับ DLL แต่ฉันจะไม่เข้าไปดู "ทำไม" และลงรายละเอียดเพิ่มเติมที่นี่)

ขณะนี้มีสี่ตัวเลือกสำหรับการตั้งค่านี้:

  1. ดีบักแบบมัลติเธรด
  2. Multithreaded Debug DLL
  3. การเปิดตัวแบบมัลติเธรด
  4. Multithreaded Release DLL

ปัญหาเฉพาะของคุณดูเหมือนจะเกิดจากการที่คุณเชื่อมโยงไลบรารีที่สร้างด้วย "Multithreaded Debug" (เช่น CRT การดีบักแบบคงที่แบบหลายเธรด) กับโปรแกรมที่สร้างขึ้นโดยใช้การตั้งค่า"Multithreaded Debug DLL " (เช่น CRT การดีบักแบบมัลติเธรดแบบไดนามิก) คุณควรเปลี่ยน การตั้งค่านี้ในไลบรารีหรือในโปรแกรมของคุณ ในตอนนี้ฉันขอแนะนำให้เปลี่ยนสิ่งนี้ในโปรแกรมของคุณ

โปรดทราบว่าเนื่องจากโครงการ Visual Studio ใช้ชุดการตั้งค่าโครงการที่แตกต่างกันสำหรับการดีบักและการสร้างรุ่น (และรุ่น 32/64 บิต) คุณควรตรวจสอบให้แน่ใจว่าการตั้งค่าตรงกับการกำหนดค่าโครงการทั้งหมดเหล่านี้

สำหรับข้อมูลเพิ่มเติม (บางส่วน) คุณสามารถดูได้ (ลิงก์จากความคิดเห็นด้านบน):

  1. คำเตือนเครื่องมือ Linker LNK4098บน MSDN
  2. / MD, / ML, / MT, / LD (ใช้ Run-Time Library)บน MSDN
  3. สร้างข้อผิดพลาดด้วย VC11 Beta - การผสม MTd libs กับ MDd exes ไม่สามารถเชื่อมโยงกับ Bugzilla @ Mozilla

UPDATE : (เป็นการตอบกลับความคิดเห็นที่ถามถึงเหตุผลที่ต้องดูแลมากขนาดนี้)

หากโค้ดสองชิ้นที่เราเชื่อมโยงเข้าด้วยกันนั้นเชื่อมโยงกันและใช้ไลบรารีมาตรฐานไลบรารีมาตรฐานจะต้องเหมือนกันสำหรับทั้งสองชิ้นเว้นแต่จะได้รับการพิจารณาอย่างดีเกี่ยวกับวิธีที่โค้ดสองชิ้นของเราโต้ตอบและส่งผ่านข้อมูล โดยทั่วไปฉันจะบอกว่าสำหรับเกือบทุกสถานการณ์ให้ใช้รันไทม์ไลบรารีมาตรฐานเวอร์ชันเดียวกัน (เกี่ยวกับการดีบัก / รีลีสเธรดและเวอร์ชันของ Visual C ++ ที่เห็นได้ชัดและอื่น ๆ เช่นการดีบักตัววนซ้ำเป็นต้น)

ส่วนที่สำคัญที่สุดของปัญหานี้คือ: มีความคิดเดียวกันเกี่ยวกับขนาดของวัตถุบนด้านข้างของสายงานอย่างใดอย่างหนึ่ง

พิจารณาเช่นว่าข้างต้นสองชิ้นของรหัสที่เรียกว่าและA BA ถูกรวบรวมเทียบกับไลบรารีมาตรฐานเวอร์ชันหนึ่งและ B เทียบกับอีกเวอร์ชันหนึ่ง ในมุมมองของ A วัตถุสุ่มบางอย่างที่ฟังก์ชันมาตรฐานส่งกลับมา (เช่นบล็อกหน่วยความจำหรือตัววนซ้ำหรือFILEวัตถุหรืออะไรก็ตาม) มีขนาดและโครงร่างที่เฉพาะเจาะจง (โปรดจำไว้ว่าโครงร่างโครงสร้างถูกกำหนดและคงที่ในเวลาคอมไพล์ใน C / C ++) ด้วยเหตุผลหลายประการความคิดของ B เกี่ยวกับขนาด / เค้าโครงของวัตถุเดียวกันจึงแตกต่างกัน (อาจเป็นเพราะข้อมูลการดีบักเพิ่มเติมวิวัฒนาการตามธรรมชาติของโครงสร้างข้อมูลเมื่อเวลาผ่านไป ฯลฯ )

ตอนนี้ถ้า A เรียกไลบรารีมาตรฐานและรับวัตถุกลับมาให้ส่งวัตถุนั้นไปที่ B และ B สัมผัสวัตถุนั้นไม่ว่าด้วยวิธีใดก็ตามโอกาสที่ B จะทำให้วัตถุนั้นยุ่งเหยิง (เช่นเขียนฟิลด์ผิดหรือเลยจุดสิ้นสุด ของมัน ฯลฯ )

ข้างต้นไม่ใช่ปัญหาเดียวที่สามารถเกิดขึ้นได้ วัตถุส่วนกลางหรือแบบคงที่ภายในในไลบรารีมาตรฐานอาจทำให้เกิดปัญหาได้เช่นกัน และมีชั้นเรียนที่คลุมเครือมากขึ้นของปัญหาเช่นกัน

ทั้งหมดนี้ทำให้แปลกขึ้นในบางแง่มุมเมื่อใช้ DLL (ไลบรารีรันไทม์แบบไดนามิก) แทน libs (ไลบรารีรันไทม์แบบคงที่)

สถานการณ์นี้สามารถนำไปใช้กับไลบรารีใด ๆ ที่ใช้โดยโค้ดสองชิ้นที่ทำงานร่วมกัน แต่ไลบรารีมาตรฐานจะถูกใช้โดยโปรแกรมส่วนใหญ่ (ถ้าไม่ใช่เกือบทั้งหมด) และจะเพิ่มโอกาสในการปะทะกัน

สิ่งที่ฉันอธิบายไว้เห็นได้ชัดว่าเป็นเวอร์ชันที่เรียบง่ายและเรียบง่ายของระเบียบที่รอคุณอยู่หากคุณผสมเวอร์ชันไลบรารี หวังว่าคงช่วยให้คุณรู้ว่าทำไมคุณถึงไม่ควรทำ!


ฉันสับสนนิดหน่อย OP ของข้อผิดพลาดคือLNK2038 เนื่องจากไม่ได้เกิดขึ้นกับ libs ทั้งหมดฉันจึงสงสัยว่า Crypto ++ มีการตั้งค่า CRT บางอย่างที่ทำให้ไม่สามารถผสมรสชาติ CRT ได้ - โดยปกติแล้วจะเป็นเพียงคำเตือน (LNK4098) และคุณอาจปลอดภัยหากคุณรู้ว่าคุณทำอะไร (ไม่แนะนำ แต่เป็นไปได้ด้วยข้อ จำกัด โปรดดูเช่นstackoverflow.com/a/19944935/948581 ) ฉันไม่รู้ว่าทำไม Crypto ++ ถึงได้รับผลกระทบแบบนี้

1
@Tibo: สิ่งเหล่านี้ไม่ใช่ไลบรารีนำเข้าสำหรับ DLL ฉันเชื่อว่า Crypto ++ ถูกเชื่อมโยงแบบคงที่กับโปรแกรมที่นี่ ซึ่งหมายความว่าสิ่งใด ๆ ที่ไม่ตรงกันในไลบรารีมาตรฐานที่เชื่อมโยงกับโมดูลหนึ่งกับอีกโมดูลหนึ่ง (อาจ) ละเมิด "กฎคำจำกัดความเดียว" ซึ่งเป็นผลเสีย สิ่งนี้เคยไม่ใช่ข้อผิดพลาดเนื่องจากตัวเชื่อมโยงไม่สามารถตรวจพบสิ่งนี้ได้ (ชื่อฟังก์ชัน / ประเภทเหมือนกัน แต่เนื้อหาและคำจำกัดความแตกต่างกันอย่างมีนัยสำคัญ) จนถึง VC10 เมื่อตัวเชื่อมโยง / บรรณารักษ์เริ่ม "แท็ก" โมดูล มันสร้างขึ้นด้วยข้อมูลเพิ่มเติมเกี่ยวกับ config ของ build ...
yzt

@Tibo: ... (ต่อจากความคิดเห็นก่อนหน้า) ตัวอย่างเช่นดูข้อผิดพลาดบล็อกแรกที่ OP รายงาน ในนั้น " RuntimeLibrary " เป็นแท็กบนทั้งไลบรารี Crypto ++ และอ็อบเจ็กต์ไฟล์สำหรับโปรแกรมของ OP และค่าของมันคือ " MDd_DynamicDebug " สำหรับหนึ่งในนั้นและ " MTd_StaticDebug " สำหรับอีกอัน ด้วยวิธีนี้ตัวเชื่อมโยงที่พยายามเชื่อมโยงไฟล์ออบเจ็กต์สองไฟล์เข้าด้วยกันสามารถตรวจจับและรายงานข้อผิดพลาดระดับใหม่ทั้งหมดได้เนื่องจากผู้เชื่อมโยงที่สร้างไฟล์ออบเจ็กต์เหล่านั้นติดแท็กข้อมูลที่เกี่ยวข้องโดยเฉพาะการตั้งค่าใด ๆ ที่อาจละเมิด ODR
yzt

แม้ว่าฉันจะเห็นด้วยกับคุณ แต่ก็ยังมีเรื่องลึกลับอยู่ที่นี่ สำหรับปัญหาของ OP ฉันเดาว่าเขารวม "dll.h" จาก Crypto ++ แล้วพยายามเชื่อมโยงกับ lib แบบคงที่แทนที่จะเป็นไลบรารีการนำเข้าของ DLL แต่ฉันเคยเห็นข้อผิดพลาดเดียวกันบนคอมพิวเตอร์เครื่องหนึ่งไม่ใช่ในอีกเครื่องหนึ่ง (ข้อผิดพลาด VS2013 ultimate sp4 -> ชุมชน VS2013 sp5 -> ตกลง) ...

1
@yzt ฉันคิดหาวิธีแก้ปัญหา แทนที่จะใช้ / ZW swicth windows มีวิธีใช้ WinRT API ผ่าน COM โดยใช้ wrapper ที่เรียกว่า WRL เป็นเพียงการไม่ใช้ / ZW ทำให้การเข้ารหัสยากเล็กน้อยเนื่องจากซ่อนรายละเอียดการใช้งาน COM แต่เป็นไปได้ที่จะใช้ WinRT โดยไม่มี / ZW
Sahil Singh

3

ฉันดาวน์โหลดและแตก Crypto ++ ใน C: \ cryptopp ฉันใช้ Visual Studio Express 2012 เพื่อสร้างโครงการทั้งหมดภายใน (ตามคำแนะนำใน readme) และทุกอย่างถูกสร้างขึ้นสำเร็จ จากนั้นฉันก็สร้างโครงการทดสอบในโฟลเดอร์อื่นและเพิ่ม cryptolib เป็นการอ้างอิง

การแปลงอาจไม่สำเร็จ สิ่งเดียวที่ประสบความสำเร็จคือการเรียกใช้ 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 จากการเขียนนี้ (มิถุนายน 1 2016) นั่นคือก่อน 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ใน notepad ค้นหาแล้วเปลี่ยนชื่อเป็น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เพิ่มการตรวจจับคำสั่งรันไทม์ ARM ซึ่งขึ้นอยู่กับการตรวจจับเวลาคอมไพล์ หากคุณเพิ่ม BLAKE2 โดยไม่มีไฟล์อื่นจะไม่มีการตรวจจับใด ๆ เกิดขึ้นและคุณจะได้รับการใช้งาน C / C ++ แบบตรง คุณอาจไม่รู้ว่าคุณกำลังพลาดโอกาส NEON ซึ่งทำงานประมาณ 9 ถึง 12 รอบต่อไบต์เทียบกับ 40 รอบต่อไบต์หรือมากกว่านั้นสำหรับวานิลลา C / C ++


ฉันทำตามคำแนะนำในวิกิ cryptopp ดาวน์โหลด vs2010-dynamic.zip และวางเนื้อหาลงในโค้ด cryptopp563 สร้างขึ้นและมีไฟล์ต้นฉบับบางไฟล์หายไป ไม่มีปัญหา wiki บอกว่า zip มีไว้สำหรับโปรเจ็กต์ล่าสุดบน github และเพียงแค่ลบไฟล์ที่หายไป ลบ ตอนนี้โปรเจ็กต์ไม่ได้สร้าง: ข้อผิดพลาดในการเชื่อมโยง 4 ตัวอย่าง: ข้อผิดพลาด LNK2001: สัญลักษณ์ภายนอกที่ไม่ได้รับการแก้ไข "void __cdecl OutputResultOperations (char const *, char const *, bool, unsigned long, double)" (? OutputResultOperations @@ YAXPBD0_NKN @ Z)
Yaniv

ปรากฎว่ามี bench.cpp ที่หายไปจากโครงการ แต่หลังจากนั้นก็ไม่ได้คอมไพล์จนกว่าฉันจะใช้การแก้ไขนี้กับ fiptest.cpp github.com/weidai11/cryptopp/pull/151/files?diff=splitฉันหวังว่าพวกเขาจะทำตามลำดับในสิ่งนี้เช่นเพิ่มไฟล์ zip ของโครงการ เข้าสู่คอมไพล์หรือบางสิ่งบางอย่าง และใช่ฉันละเลยที่จะบอกว่าคอมไพเลอร์ของฉันคืออัพเดต VS2015 2 บรรทัดล่างทำตามคำแนะนำที่ฉันเขียนและมันใช้งานได้
Yaniv

@ Yaniv - สำหรับความคิดเห็นแรกคุณแนะนำอะไรเพื่อให้ผู้ใช้รายอื่นไม่ประสบปัญหา สำหรับความคิดเห็นที่ 2 เราวางแผนที่จะทำการแก้ไขเมื่อเราได้รับการทดสอบอย่างสมบูรณ์แล้ว มีอะไรที่เราสามารถทำได้ในระหว่างนี้หรือไม่? (ฉันได้เพิ่มข้อมูลเพิ่มเติมในคำตอบนี้แล้ว แต่ต้องการให้แน่ใจว่าผู้ใช้จะไม่มีปัญหา)
jww

ประการแรกขอบคุณมากที่ทำสิ่งนี้ Crypto ++ หินจริงๆ เกี่ยวกับปัญหาการสร้างพยายามทำให้ windows sln และไฟล์โครงการเข้ากันได้กับไฟล์ล่าสุดในโครงการและเนื่องจากการเปลี่ยนแปลงเหล่านี้แน่นอนว่าการสร้างหน้าต่างเหล่านี้ควรเชื่อมโยงกับ codebase อย่างใดและอาจอยู่ในแผนผังซอร์ส หากมากเกินไปอย่างน้อยตรวจสอบให้แน่ใจว่าไฟล์ zip ที่มีสภาพแวดล้อมการสร้างสตูดิโอภาพเข้ากันได้กับเวอร์ชันทางการที่เสถียรในปัจจุบัน
Yaniv

เกี่ยวกับแพทช์สำหรับ fiptest.cpp - ดูเหมือนว่าจะมีบางอย่างที่แตกต่างออกไปเกี่ยวกับ VS2015 ดังนั้นฉันเดาว่าใครก็ตามที่ต้องการใช้ VS2015 จำเป็นต้องใช้แพตช์นี้ เป็นอีกกรณีหนึ่งในบล็อก #ifdef ที่ดูเหมือนจะกำหนดการเรียกกลับการดีบักที่ถูกต้องสำหรับ VS2015 และมันง่ายมากที่จะแก้ไขด้วยตนเอง
Yaniv

3

ฉันมีปัญหานี้และไม่ตรงกันใน ITERATOR_DEBUG_LEVEL ในฐานะที่เป็นปัญหาวันอาทิตย์ - เย็นหลังจากที่ทุกอย่างดูโอเคและไปได้ดีฉันจึงถูกเลื่อนออกไปในบางครั้ง การทำงานใน VS2017 IDE (Solution Explorer) ฉันเพิ่งเพิ่ม / คัดลอกการอ้างอิงไฟล์ต้นฉบับไปยังโปรเจ็กต์ของฉัน (ctrl-drag) จากโปรเจ็กต์อื่น ดูคุณสมบัติ -> C / C ++ / ตัวประมวลผลล่วงหน้า - ที่ระดับไฟล์ต้นฉบับไม่ใช่ระดับโปรเจ็กต์ - ฉันสังเกตเห็นว่าในการกำหนดค่ารีลีส _DEBUG ถูกระบุแทน NDEBUG สำหรับไฟล์ต้นฉบับนี้ ซึ่งเป็นการเปลี่ยนแปลงทั้งหมดที่จำเป็นเพื่อกำจัดปัญหา


1

ปัญหาสามารถแก้ไขได้โดยการเพิ่ม CRT ของ msvcrtd.lib ในไลบรารีตัวเชื่อมโยง เนื่องจาก cryptlib.lib ใช้การดีบักเวอร์ชัน CRT

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.