Saya mengunduh dan mengekstrak Crypto ++ di C: \ cryptopp. Saya menggunakan Visual Studio Express 2012 untuk membangun semua proyek di dalamnya (seperti yang diinstruksikan dalam readme), dan semuanya berhasil dibangun. Kemudian saya membuat proyek uji di beberapa folder lain dan menambahkan cryptolib sebagai dependensi. Setelah itu, saya menambahkan jalur penyertaan sehingga saya dapat dengan mudah menyertakan semua header. Ketika saya mencoba mengompilasi, saya mendapat kesalahan tentang simbol yang belum terselesaikan.
Untuk mengatasinya, saya menambahkan C:\cryptopp\Win32\Output\Debug\cryptlib.lib
ke link dependensi tambahan. Sekarang saya mendapatkan kesalahan ini:
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
Saya juga mendapatkan:
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
Kode yang saya coba kompilasi sederhana (saya mendapatkannya dari situs lain):
#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;
}
Ada ide bagaimana cara memperbaikinya? Saya benar-benar hanya membutuhkan SHA-256 sekarang, tidak ada yang lain. Saya menggunakan Windows 7 64 bit, dan saya mengunduh VS C ++ hari ini, jadi ini harus versi terbaru.
VCUpgrade
. Anda melihat gejala kegagalan VCUpgrade yang dilaporkan sebagai Berhasil kepada Anda.Jawaban:
(Ini sudah dijawab dalam komentar, tetapi karena tidak ada jawaban yang sebenarnya , saya menulis ini.)
Masalah ini muncul dalam versi Visual C ++ yang lebih baru (versi yang lebih lama biasanya hanya menautkan program secara diam-diam dan akan macet dan terbakar pada saat dijalankan.) Ini berarti bahwa beberapa pustaka yang Anda tautkan dengan program Anda (atau bahkan beberapa sumber file di dalam program Anda sendiri) menggunakan versi CRT yang berbeda (perpustakaan C RunTime.)
Untuk memperbaiki kesalahan ini, Anda perlu masuk ke Anda
Project Properties
(dan / atau perpustakaan yang Anda gunakan,) lalu keC/C++
, laluCode Generation
, dan periksa nilaiRuntime Library
; ini harus persis sama untuk semua file dan pustaka yang Anda tautkan. (Aturannya sedikit lebih santai untuk menghubungkan dengan DLL, tetapi saya tidak akan membahas "mengapa" dan lebih detail di sini.)Saat ini ada empat opsi untuk pengaturan ini:
Masalah khusus Anda tampaknya berasal dari Anda menautkan pustaka yang dibangun dengan "Multithreaded Debug" (yaitu CRT debug multithread statis) terhadap program yang sedang dibangun menggunakan setelan "Multithreaded Debug DLL " (yaitu CRT debug multithread dinamis.) Anda harus mengubah pengaturan ini baik di perpustakaan, atau di program Anda. Untuk saat ini, saya sarankan mengubah ini di program Anda.
Perhatikan bahwa karena proyek Visual Studio menggunakan set yang berbeda dari pengaturan proyek untuk debug dan rilis build (dan 32/64-bit build), Anda harus memastikan pengaturan cocok di semua konfigurasi proyek ini.
Untuk (beberapa) informasi lebih lanjut, Anda dapat melihat ini (ditautkan dari komentar di atas):
PEMBARUAN : (Ini adalah tanggapan atas komentar yang menanyakan alasan mengapa banyak perawatan ini harus dilakukan.)
Jika dua bagian kode yang kita tautkan bersama-sama tertaut dan menggunakan pustaka standar, maka pustaka standar harus sama untuk keduanya, kecuali jika perhatian besar diberikan tentang bagaimana dua bagian kode kita berinteraksi dan menyebarkan data. Secara umum, saya akan mengatakan bahwa untuk hampir semua situasi cukup gunakan versi yang sama persis dari runtime perpustakaan standar (mengenai debug / rilis, utas, dan jelas versi Visual C ++, antara lain seperti debugging iterator, dll.)
Bagian terpenting dari masalahnya adalah ini: memiliki gagasan yang sama tentang ukuran objek di kedua sisi pemanggilan fungsi .
Pertimbangkan misalnya bahwa dua bagian kode di atas disebut
A
danB
. A dikompilasi terhadap satu versi pustaka standar, dan B terhadap versi lainnya. Dalam pandangan A, beberapa objek acak yang dikembalikan oleh fungsi standar (misalnya blok memori atau iterator atauFILE
objek atau apa pun) memiliki ukuran dan tata letak tertentu (ingat bahwa tata letak struktur ditentukan dan diperbaiki pada waktu kompilasi di C / C ++.) Untuk beberapa alasan, gagasan B tentang ukuran / tata letak objek yang sama berbeda (bisa jadi karena informasi debug tambahan, evolusi alami struktur data dari waktu ke waktu, dll.)Sekarang, jika A memanggil pustaka standar dan mendapatkan sebuah objek kembali, lalu meneruskan objek itu ke B, dan B menyentuh objek itu dengan cara apa pun, kemungkinan B akan mengacaukan objek itu (misalnya menulis bidang yang salah, atau melewati ujungnya dari itu, dll.)
Hal di atas bukanlah satu-satunya jenis masalah yang dapat terjadi. Objek global atau statis internal di pustaka standar juga dapat menyebabkan masalah. Dan ada juga kelas masalah yang lebih tidak jelas.
Semua ini menjadi lebih aneh dalam beberapa aspek saat menggunakan DLL (pustaka runtime dinamis) daripada libs (pustaka runtime statis.)
Situasi ini dapat diterapkan ke pustaka apa pun yang digunakan oleh dua bagian kode yang bekerja bersama, tetapi pustaka standar digunakan oleh sebagian besar (jika tidak hampir semua) program, dan itu meningkatkan kemungkinan bentrokan.
Apa yang saya jelaskan jelas merupakan versi yang dipermudah dan disederhanakan dari kekacauan sebenarnya yang menanti Anda jika Anda mencampur versi perpustakaan. Saya harap ini memberi Anda gambaran tentang mengapa Anda tidak boleh melakukannya!
sumber
Konversi tersebut mungkin tidak berhasil. Satu-satunya hal yang berhasil adalah menjalankan VCUpgrade. Konversi yang sebenarnya sendiri gagal tetapi Anda tidak tahu sampai Anda mengalami kesalahan yang Anda lihat. Untuk beberapa detail, lihat Visual Studio di Crypto ++ wiki.
Untuk mengatasi masalah Anda, Anda harus mendownload
vs2010.zip
jika Anda menginginkan penautan runtime C / C ++ statis (/MT
atau/MTd
), atauvs2010-dynamic.zip
jika Anda ingin penautan waktu proses C / C ++ dinamis (/MT
atau/MTd
). Keduanya memperbaiki kegagalan tersembunyi dan laten yang dihasilkan oleh VCUpgrade.vs2010.zip
,vs2010-dynamic.zip
danvs2005-dynamic.zip
dibuat dari sumber GitHub terbaru . Pada tulisan ini (1 JUN 2016), itu efektif sebelum Crypto ++ 5.6.4. Jika Anda menggunakan file ZIP dengan Crypto ++ level bawah, seperti 5.6.2 atau 5.6.3, Anda akan mengalami masalah kecil.Ada dua masalah kecil yang saya sadari. Pertama adalah mengganti nama
bench.cpp
menjadibench1.cpp
. Kesalahannya adalah: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)
Cara mengatasinya adalah (1) buka
cryptest.vcxproj
di notepad, temukanbench1.cpp
, lalu ganti namanya menjadibench.cpp
. Atau (2) ubah namabench.cpp
menjadibench1.cpp
pada sistem file. Tolong jangan hapus file ini.Masalah kedua sedikit lebih rumit karena ini adalah target yang bergerak. Rilis level bawah, seperti 5.6.2 atau 5.6.3, tidak memiliki kelas terbaru yang tersedia di GitHub . File kelas yang hilang termasuk HKDF (5.6.3), RDRAND (5.6.3), RDSEED (5.6.3), ChaCha (5.6.4), BLAKE2 (5.6.4), Poly1305 (5.6.4), dll.
Perbaikannya adalah menghapus file sumber yang hilang dari file proyek Visual Studio karena tidak ada untuk rilis tingkat bawah.
Opsi lainnya adalah menambahkan file kelas yang hilang dari sumber terbaru, tetapi mungkin ada komplikasi. Misalnya, banyak sumber yang secara halus bergantung pada yang terbaru
config.h
,cpu.h
dancpu.cpp
. Yang "halus" adalah Anda tidak akan menyadari bahwa Anda mendapatkan kelas yang berkinerja rendah.Contoh kelas berkinerja rendah adalah BLAKE2.
config.h
menambahkan waktu kompilasi deteksi ARM-32 dan ARM-64.cpu.h
dancpu.cpp
menambahkan deteksi instruksi ARM runtime, yang bergantung pada deteksi waktu kompilasi. Jika Anda menambahkan BLAKE2 tanpa file lain, maka tidak ada pendeteksian yang terjadi dan Anda mendapatkan implementasi C / C ++ langsung. Anda mungkin tidak akan menyadari bahwa Anda kehilangan peluang NEON, yang berjalan sekitar 9 hingga 12 siklus per byte versus 40 siklus per byte atau lebih untuk vanilla C / C ++.sumber
Saya mengalami masalah ini bersama dengan ketidakcocokan di ITERATOR_DEBUG_LEVEL. Karena masalah Minggu-malam tampaknya baik-baik saja dan baik untuk dilakukan, saya dikeluarkan untuk beberapa waktu. Bekerja di VS2017 IDE (Solution Explorer) Saya baru saja menambahkan / menyalin referensi file sumber ke proyek saya (ctrl-drag) dari proyek lain. Melihat properti-> C / C ++ / Preprocessor - di level file sumber, bukan level project - Saya melihat bahwa dalam konfigurasi Rilis _DEBUG yang ditentukan, bukan NDEBUG untuk file sumber ini. Yang mana saja perubahan yang diperlukan untuk menghilangkan masalah.
sumber
Masalah dapat diselesaikan dengan menambahkan CRT msvcrtd.lib di pustaka linker. Karena cryptlib.lib menggunakan versi debug CRT.
sumber