Я пытаюсь использовать Crypto++ в iOS. Я загрузил заранее подготовленную версию библиотеки от Marek Kotewicz GitHub.
Я изо всех сил пытаюсь запустить этот образец кода из вики Crypto++.
ECDSA<ECP, CryptoPP::SHA256>::PrivateKey privateKey;
ECDSA<ECP, CryptoPP::SHA256>::PublicKey publicKey;
AutoSeededRandomPool prng, rrng;
privateKey.Initialize(prng, CryptoPP::ASN1::secp256k1());
privateKey.MakePublicKey(publicKey);
string signature;
string message = "Do or do not. There is no try.";
StringSource s(message, true,
new SignerFilter(rrng,
ECDSA<ECP, CryptoPP::SHA256>::Signer(privateKey),
new StringSink(signature)));
Его сбой со следующим. Его отображение в окне вывода Xcode:
BAD_ACCESS (code=EXC_I386_GPFLT)
Это фрагмент кода из памяти.h файла c++, где он указывает BAD_ACCESS
_LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;}
Я получаю ошибку BAD_ACCESS (code = 1, address = 0x0), указывающую на эту строку кода библиотеки
-> 0x1065dfa8d <+85>: movq -0x58(%rbp), %rdi
Его сбой со следующим. Его отображение в окне вывода Xcode:
BAD_ACCESS(code=EXC_I386_GPFLT)
Код выглядит хорошо для меня.
Я пытаюсь использовать Crypto++ в iOS. Я загрузил заранее подготовленную версию библиотеки от Marek Kotewicz GitHub.
Я просто беру удар в темноте. Он предполагает, что код, который вы показали выше, действительно все, что вы делаете, скажем, в тесте ViewController
.
Предкомпилированная библиотека, похоже, использует библиотеку GNU Standard C++. Я бы переключился на библиотеку LLVM Standard C++, создав Crypto++ с помощью -stdlib=C++
(а не GNU -stdlib=stdC++
). Apple переключилась на него много лет назад, и Xcode использует его по умолчанию.
Вы можете найти GitHub с библиотекой жира, используя LLVM Standard C++ в noloader/cryptopp-5.6.2-ios.
Или вы можете сами построить жировую библиотеку. Для этого см. IOS (Командная строка) в вики Crypto++. Предварительно построенная библиотека в cryptopp-5.6.2-ios использует эти инструкции.
AutoSeededRandomPool prng, rrng;
Вам нужно только одно из них.
StringSource s(message, true, new SignerFilter(rrng, ECDSA<ECP, CryptoPP::SHA256>::Signer(privateKey), new StringSink(signature)));
На протяжении многих лет я задумывался о временном подписчике, созданном для трубопровода. Я изменил вики Crypto++, чтобы прекратить их использовать. Вместо этого используйте этот код:
ECDSA<ECP, CryptoPP::SHA256>::PrivateKey privateKey;
...
ECDSA<ECP, CryptoPP::SHA256>::Signer signer(privateKey);
...
StringSource s(message, true,
new SignerFilter(prng, signer,
new StringSink(signature)));
ECDSA<ECP, CryptoPP::SHA256>::Signer
, а не временный? Код все еще показывает временный.
__ptr_
не равенNULL
перед вызовомdelete
я чувствую~
освобождает память, выделенную для этого__ptr_