cryptopp使用Qt mingw编译,以及海思平台交叉编译
编译工程生成,使用qmake生成qt工程文件(海思平台时,要用海思平台的qmake),将
TEMPLATE = app
修改为:
TEMPLATE = lib
添加如下:
win32:LIBS += -lws2_32 #windows下用的
QMAKE_CXXFLAGS += -msse4 -maes -mpclmul -msha
在windows下,用mingw
windows下编译好之后,头文件放入到mingw的include里,如下路径:
D:\Qt\Qt5.12.6\5.12.6\mingw73_32\include
libcryptopp.a要放在如下目录里:
D:\Qt\Qt5.12.6\Tools\mingw730_32\lib
海思的库文件和头文件编译好之后,可以放入到编译器的安装目录下(我用的是静态库):
/opt/hisi-linux/x86-arm/arm-hisiv500-linux/target/usr
这个目录下的include和lib下面
windows下编译没有遇到问题,直接可以编译通过,下面都是海思编译器交叉编译的问题:
-----------------------------------------------------------------------------------------------------
1.编译错误1
arm-hisiv500-linux-g++ -c -pipe -msse4 -maes -mpclmul -msha -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I../../cryptopp800 -I. -I../../cryptopp800 -I/opt/qt5.12-arm/include -I/opt/qt5.12-arm/include/QtGui -I/opt/qt5.12-arm/include/QtCore -I. -I/opt/qt5.12-arm/mkspecs/linux-hisiv500-g++ -o 3way.o ../3way.cpp
arm-hisiv500-linux-g++: error: unrecognized command line option ‘-msse4’
arm-hisiv500-linux-g++: error: unrecognized command line option ‘-maes’
arm-hisiv500-linux-g++: error: unrecognized command line option ‘-mpclmul’
arm-hisiv500-linux-g++: error: unrecognized command line option ‘-msha’
Makefile:1303: recipe for target '3way.o' failed
make: *** [3way.o] Error 1
原因:
海思编译器可能不支持-msse4 -maes -mpclmul -msha编译选项;
去掉这几项即可编译
-----------------------------------------------------------------------------------------------------
2.编译错误2
/opt/hisi-linux/x86-arm/arm-hisiv500-linux/lib/gcc/arm-hisiv500-linux-uclibcgnueabi/4.9.4/include/arm_neon.h:31:2: error: #error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) to use arm_neon.h
#error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) to use arm_neon.h
^
../aria_simd.cpp:66:34: error: ‘uint32x4_t’ does not name a type
inline void ARIA_GSRK_NEON(const uint32x4_t X, const uint32x4_t Y, byte RK[16])
^
../aria_simd.cpp:66:54: error: ‘uint32x4_t’ does not name a type
inline void ARIA_GSRK_NEON(const uint32x4_t X, const uint32x4_t Y, byte RK[16])
^
../aria_simd.cpp: In function ‘void CryptoPP::ARIA_UncheckedSetKey_Schedule_NEON(CryptoPP::byte*, CryptoPP::word32*, unsigned int)’:
../aria_simd.cpp:81:8: error: ‘uint32x4_t’ does not name a type
const uint32x4_t w0 = vld1q_u32(ws+ 0);
^
../aria_simd.cpp:82:8: error: ‘uint32x4_t’ does not name a type
const uint32x4_t w1 = vld1q_u32(ws+ 8);
^
../aria_simd.cpp:83:8: error: ‘uint32x4_t’ does not name a type
const uint32x4_t w2 = vld1q_u32(ws+12);
^
../aria_simd.cpp:84:8: error: ‘uint32x4_t’ does not name a type
const uint32x4_t w3 = vld1q_u32(ws+16);
^
../aria_simd.cpp:86:21: error: ‘w0’ was not declared in this scope
ARIA_GSRK_NEON<19>(w0, w1, rk + 0);
^
../aria_simd.cpp:86:25: error: ‘w1’ was not declared in this scope
ARIA_GSRK_NEON<19>(w0, w1, rk + 0);
^
../aria_simd.cpp:87:25: error: ‘w2’ was not declared in this scope
ARIA_GSRK_NEON<19>(w1, w2, rk + 16);
^
../aria_simd.cpp:88:25: error: ‘w3’ was not declared in this scope
ARIA_GSRK_NEON<19>(w2, w3, rk + 32);
^
../aria_simd.cpp: At global scope:
../aria_simd.cpp:79:59: warning: unused parameter ‘ws’ [-Wunused-parameter]
void ARIA_UncheckedSetKey_Schedule_NEON(byte* rk, word32* ws, unsigned int keylen)
^
../aria_simd.cpp: In function ‘void CryptoPP::ARIA_ProcessAndXorBlock_NEON(const byte*, CryptoPP::byte*, const byte*, CryptoPP::word32*)’:
../aria_simd.cpp:137:22: error: ‘vld1q_u8’ was not declared in this scope
vld1q_u8(xorBlock),
^
../aria_simd.cpp:140:31: error: ‘vrev32q_u8’ was not declared in this scope
vrev32q_u8(vld1q_u8((rk))))));
^
../aria_simd.cpp:140:32: error: ‘veorq_u8’ was not declared in this scope
vrev32q_u8(vld1q_u8((rk))))));
^
../aria_simd.cpp:140:33: error: ‘veorq_u8’ was not declared in this scope
vrev32q_u8(vld1q_u8((rk))))));
^
../aria_simd.cpp:140:33: error: redeclaration of ‘<typeprefixerror>veorq_u8’
../aria_simd.cpp:140:32: note: previous declaration ‘<typeprefixerror>veorq_u8’
vrev32q_u8(vld1q_u8((rk))))));
^
../aria_simd.cpp:140:34: error: ‘vst1q_u8’ was not declared in this scope
vrev32q_u8(vld1q_u8((rk))))));
^
../aria_simd.cpp:146:22: error: ‘vld1q_u8’ was not declared in this scope
vld1q_u8(outBlock),
^
../aria_simd.cpp:147:28: error: ‘vrev32q_u8’ was not declared in this scope
vrev32q_u8(vld1q_u8(rk))));
^
../aria_simd.cpp:147:29: error: ‘veorq_u8’ was not declared in this scope
vrev32q_u8(vld1q_u8(rk))));
^
../aria_simd.cpp:147:30: error: ‘vst1q_u8’ was not declared in this scope
vrev32q_u8(vld1q_u8(rk))));
^
Makefile:1378: recipe for target 'aria_simd.o' failed
make: *** [aria_simd.o] Error 1
原因:
Makefile中的加上-mfloat-abi=softfp -mfpu=neon编译选项:
CXXFLAGS = -pipe -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC $(DEFINES) -mfloat-abi=softfp -mfpu=neon
------------------------------------------------------------------------------------------------------
3.问题3,这个是编译测试代码时的问题:
arm-hisiv500-linux-g++ -Wl,-O1 -Wl,-rpath,/opt/qt5.12-arm/lib -o ../bin/CerealApp temp/obj/harddriver.o temp/obj/main.o temp/obj/registerhandle.o temp/obj/moc_registerhandle.o -lcryptopp /opt/qt5.12-arm/lib/libQt5Charts.so /opt/qt5.12-arm/lib/libQt5Widgets.so /opt/qt5.12-arm/lib/libQt5Gui.so /opt/qt5.12-arm/lib/libQt5Network.so /opt/qt5.12-arm/lib/libQt5Sql.so /opt/qt5.12-arm/lib/libQt5SerialPort.so /opt/qt5.12-arm/lib/libQt5Core.so -lpthread
/opt/hisi-linux/x86-arm/arm-hisiv500-linux/bin/../target/usr/lib/libcryptopp.a(rijndael.o):在函数‘CryptoPP::CRYPTOGAMS_set_encrypt_key(unsigned char const*, int, unsigned int*)’中:
rijndael.cpp:(.text+0x300):对‘AES_set_encrypt_key’未定义的引用
/opt/hisi-linux/x86-arm/arm-hisiv500-linux/bin/../target/usr/lib/libcryptopp.a(rijndael.o):在函数‘CryptoPP::CRYPTOGAMS_set_decrypt_key(unsigned char const*, int, unsigned int*)’中:
rijndael.cpp:(.text+0x304):对‘AES_set_decrypt_key’未定义的引用
/opt/hisi-linux/x86-arm/arm-hisiv500-linux/bin/../target/usr/lib/libcryptopp.a(rijndael.o):在函数‘CryptoPP::CRYPTOGAMS_encrypt(unsigned char const*, unsigned char const*, unsigned char*, unsigned int const*)’中:
rijndael.cpp:(.text+0x31c):对‘AES_encrypt’未定义的引用
/opt/hisi-linux/x86-arm/arm-hisiv500-linux/bin/../target/usr/lib/libcryptopp.a(rijndael.o):在函数‘CryptoPP::CRYPTOGAMS_decrypt(unsigned char const*, unsigned char const*, unsigned char*, unsigned int const*)’中:
rijndael.cpp:(.text+0xadc):对‘AES_decrypt’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:206: recipe for target '../bin/CerealApp' failed
make: *** [../bin/CerealApp] Error 1
问题原因是:
aes_armv4.S文件没有编译,在使用qmake生成工程文件时,该文件没有被加进去,
只需要在工程文件里的添加到source,然后重新执行qmake生成Makefile,再次编译没有问题了。
使用方法,核心代码:
//------------------------
// 生成RSA密钥对
//------------------------
void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed){
RandomPool randPool;
randPool.IncorporateEntropy((unsigned char *)seed, strlen(seed));
RSAES_OAEP_SHA_Decryptor priv(randPool, keyLength);
HexEncoder privFile(new FileSink(privFilename));
priv.AccessMaterial().Save(privFile);
privFile.MessageEnd();
RSAES_OAEP_SHA_Encryptor pub(priv);
HexEncoder pubFile(new FileSink(pubFilename));
pub.AccessMaterial().Save(pubFile);
pubFile.MessageEnd();
}
//------------------------
// RSA加密
//------------------------
string RSAEncryptString(const char *pubFilename, const char *seed, const char *message){
FileSource pubFile(pubFilename, true, new HexDecoder);
RSAES_OAEP_SHA_Encryptor pub(pubFile);
RandomPool randPool;
randPool.IncorporateEntropy((unsigned char *)seed, strlen(seed));
std::string result;
StringSource(message, true, new PK_EncryptorFilter(randPool, pub, new HexEncoder(new StringSink(result))));
return result;
}
//------------------------
// RSA解密
//------------------------
string RSADecryptString(const char *privFilename, const char *ciphertext){
FileSource privFile(privFilename, true, new HexDecoder);
RSAES_OAEP_SHA_Decryptor priv(privFile);
std::string result;
try{
StringSource(ciphertext, true,
new HexDecoder(new PK_DecryptorFilter(GlobalRNG(), priv, new StringSink(result))));
}
catch(const Exception &e)
{
std::cout << "\nException caught: " << e.what() << std::endl;
return "";
}
catch(const std::exception &e)
{
std::cout << "\nstd::exception caught: " << e.what() << std::endl;
return "";
}
// std::cout << "result: " << result<< std::endl;
return result;
}
微信订阅号:
cryptopp使用Qt mingw编译,以及海思平台交叉编译的更多相关文章
- 海思平台交叉编译curl支持SSL功能
1.准备工具 1).交叉编译工具 2).下载libcurl和openssl源代码,我使用的是(openssl-1.0.2o.tar,curl-7.59.0.tar) 3).查看cpu详细 ~ # ca ...
- 用VS2013+VELT-0.1.4进行海思平台 Linux内核 的开发
快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 本文仅适用于vs20 ...
- 【ARM-Linux开发】用VS2013+VELT-0.1.4进行海思平台 Linux内核 的开发
1.1 什么是VELT VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件 ...
- OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台
前言 移植opencv到海思平台,opencv支持对视频进行解码,需要对应的ffmpeg支持. Ffmpeg的移植 Ffmpeg的移植请参考之前的文章:<FFmpeg开发笔记(十): ...
- 海思平台服务器版软件V15.2产品发布
深度操作系统海思平台服务器版软件是武汉深之度科技有限公司发布的针对华为海思平台的TaiShan系列服务器发布的企业级服务器操作系统软件产品,主要面向企业级服务器应用场景,为用户在国产化平台上提供更具可 ...
- (转)海思平台HI35XX系列内存设置
海思平台的内存分为两部分,一部分给系统使用,另外的一部分给多媒体使用.可以通过cat /proc/meminfo查看系统内存和cat /proc/media-mem 查看多媒体内存使用情况. /pro ...
- libx264开发笔记(一):libx264介绍、海思平台移植编译
前言 在编译ffmpeg时,使用到h264编码时是需要依赖libx264的,本文章是将将libx264作为静态库移植到海思上. 相关博客 <Qt开发笔记之编码x264码流并封装mp4(一 ...
- 用vs2013+velt-0.1.4进行嵌入式开发 进行海思平台 UBOOT 开发
1.1 什么是VELT VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件 ...
- 海思dv300cv500交叉编译webrtc
感谢声网提供的webrtc国内源码镜像. 首先要安装好海思编译工具链和git. 先替换一下webrtc代码的仓库网址路径 git config --global user.email "10 ...
随机推荐
- Tomcat双击startup.bat闪退的原因及解决方式
很久不碰Tomcat了,最近因为种种原因需要重新投入到Java Web的怀抱,所以又重新接触了Tomcat 我下载了tomcat的压缩包将其解压缩到某个位置,我这里是D盘下的tomcat文件夹中,但是 ...
- Scrapy(五):CrawlSpider的使用
Scrapy(五):CrawlSpider的使用 说明 :CrawlSpider,就是一个类,是Spider的一个子类,也是一个官方类,因为是子类,所以功能更加的强大,多了一项功能:去指定的页面中来抓 ...
- 机器学习实战基础(十三):sklearn中的数据预处理和特征工程(六)特征选择 feature_selection 简介
当数据预处理完成后,我们就要开始进行特征工程了. 在做特征选择之前,有三件非常重要的事:跟数据提供者开会!跟数据提供者开会!跟数据提供者开会!一定要抓住给你提供数据的人,尤其是理解业务和数据含义的人, ...
- Flask 基础组件(一):基本使用
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- 有效提高java编程安全性的12条黄金法则
安全性是软件开发中最复杂,最广泛和最重要的考量之一.Java是具有许多内置安全性功能的开发平台,java在长期的发展过程中,已经经过了很多高强度的安全测试,并经常更新安全漏洞.并且Java生态系统还包 ...
- Python 中的面向对象编程
面向对象编程(Object-oriented programming, OOP)是一种基于对象概念的编程范式,可包含属性(attribute)形式的数据以及方法(method)形式的代码.另一种对 O ...
- 又被逼着优化代码,这次我干掉了出入参 Log日志
本文收录在个人博客:www.chengxy-nds.top,技术资源共享. 最近技术部突然刮起一阵 review 代码的小风,挨个项目组过代码,按理说这应该是件挺好的事,让别人指出自己代码中的不足,查 ...
- TLV通信协议
基础 TLV协议是BER编码的一种,全称是Tag.length.value.该协议简单高效,能适用于各种通信场景,且具有良好的可扩展性.TLV协议的基本格式如下: 其中,Tag占2个字节,是报文的唯一 ...
- Shell基本语法---if语句
if语句 格式 #单分支 if [ 条件判断 ]; then 执行动作 fi if [ 条件判断 ]; then 执行动作 else 执行动作 fi #多分支 if [条件判断]; then 执行动作 ...
- GitHub 热点速览 Vol.29:程序员资料大全
作者:HelloGitHub-小鱼干 摘要:有什么资料比各种大全更吸引人的呢?先马为敬,即便日后"挺尸"收藏夹,但是每个和程序相关的大全项目都值得一看.比如国内名为小傅哥整理的 J ...