由于项目中经常用到第三方库,但是一直不具备交叉编译的能力,因此选用项目中的链接库 openssl为实验基础,通过编译openssl库熟悉交叉编译的技术
本文将展示编译过程中的种种坑,便于萌新避坑,当然,openssl 1.0.X 版本编译方式本1.1.1.x编译方式不同
环境:操作系统:win10,vs版本2013
官网 :https://www.openssl.org/source/
本文编译的是openssl-1.1.1k版本,下载完成后直接解压到openssl_build文件夹下
在openssl_build目录下创建OpenSSL文件夹,用于安装编译后的openssl
官网 : https://www.activestate.com/products/perl/downloads/
本文使用的版本:
默认安装路径安装ActivePerl后,进入安装目录C:\Perl64\bin
打开cmd 输入命令 perl -v 查看安装版本
安装完成后设置环境变量
注意:路径是C:\Perl64\bin,你安装路径的bin目录
官网 : https://www.nasm.us/
安装nasm成功后,将安装路径添加到环境变量
打开cmd
cd C:\openssl_build\openssl-1.1.1k 进入openssl目录
perl Configure VC-WIN32 –prefix=C:\openssl_build\OpenSSL 将其安装到OpenSSL目录下
如果该步骤出现错误信息
解决办法,修改C:/Perl64/site/lib/ActivePerl/Config.pm,大约在400行左右:
修改为
# Prevent calling Win32::Console::DESTROY on a STDOUT handle
my $console;
sub _warn {
# my($msg) = @_;
# unless (-t STDOUT) {
# print "\n$msg\n";
# return;
# }
# require Win32::Console;
# unless ($console) {
# $console = Win32::Console->new(Win32::Console::STD_OUTPUT_HANDLE());
# }
# my($col,undef) = $console->Size;
# print "\n";
# my $attr = $console->Attr;
# $console->Attr($Win32::Console::FG_RED | $Win32::Console::BG_WHITE);
# for (split(/\n/, "$msg")) {
# $_ .= " " while length() < $col-1;
# print "$_\n";
# }
# $console->Attr($attr);
# print "\n";
}
再次执行perl Configure VC-WIN32 –prefix=C:\openssl_build\OpenSSL.生成Makefile
由于新版本的openssl ms没有 do_nasm,所以使用makefile 通过nmake编译
直接输入命令nmake会显示错误,因为目前为止还是使用的windows自带的cmd命令行
解决方法:
输入如下命令
cd C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC
vcvarsall.bat(该名字随vs版本而变,可通过输入vcv后按Tab键自动补全)
注解: nmake由vs提供,需要将普通windows cmd切换到vs的cmd,在你的vs安装目录下找Microsoft Visual Studio 8类似字样的目录(vs的默认目录名)选择你安装的vs版本目录,随意选择一个,尽量选高版本
执行完后输入切换目录命令
cd C:\openssl_build\openssl-1.1.1k 进入openssl目录
nmake
编译需要很长时间,编译完成后如下图
输入命令
nmake test
发现在test\recipes\70-test_comp.t .....................的时候卡住了
问题原因: https://github.com/openssl/openssl/issues/7203
Perl for mingw与VS混合使用
perl正在等待来自stdin的输入(不消耗CPU时间,回显键盘输入)
解决方法:
换个ActivePerl 版本
目前使用
从头开始再来一遍(重复全部操作流程,增加记忆)
很可惜本次nmake 编译成功但是测试nmake test时出错
上面这个问题找不到解决方案,openssl1.1.1系列编译测试失败,暂时没有好的解决方案,但是编译openssl库流程准确,编译测试涉及本地环境,本文失败了不代表所有编译测试均失败,本文踩了大量的坑,希望对你有所帮助
如果上面测试成功,则通过nmake -f makefile install指令将编译好的库文件安装到OpenSSL目录
注:上文中的perl 使用perl Configure VC-WIN32 no-shared no-asm no-tests -D_WIN32_WINNT=0x0501 --prefix=C:\openssl_build\OpenSSL\release_static_lib
指令可成功编译openssl 库
nmake指令:
输入指令 |
指令含义 |
nmake |
编译makefile文件 |
nmake install |
安装编译好的文件到指定目录 |
nmake clean |
清除上一次编译的内容,建议在切换debug/release版本编译时使用 |
perl Configure VC-WIN32 no-shared no-asm no-tests -D_WIN32_WINNT=0x0501 --prefix=C:\openssl_build\OpenSSL\release_static_lib
该perl指令含义: 指定生成 win32库(默认release版本), 静态库,不使用汇编,不编译测试文件,支持xp,指定安装目录为C:\openssl_build\OpenSSL\release_static_lib
-D_WIN32_WINNT=0x0501为XP系统下需要,其他系统没测试,可能其他高版本系统不需要此项
VS工程的运行时库(Runtime Library)选择应与编译出的openssl库匹配,尤其动态库,否则可能编译不过。静态库可能例外,本人只验证了一种,可行。
需要使用静态库的时候,如果编译不过,出现LNK2019等错误的时候,你可能还需要添加ws2_32.lib,crypt32.lib库
教程原文: https://blog.csdn.net/qq_22000459/article/details/82968171
执行Configure是常见参数选项如下:
参数 |
含义 |
默认 |
VC-WIN32 VC-WIN64A |
编译win32版本 编译win64版本 |
|
no-tests |
不编译测试文件 |
|
--debug --release |
编译debug版本 编译release版本 |
默认release版本 |
--openssldir=OPENSSLDIR |
安装目录 |
默认是/usr/local/ssl |
--prefix=PREFIX |
设置 lib include bin 目录的前缀 |
默认为 OPENSSLDIR 目录 |
--install_prefix=DESTDIR |
设置安装时以此目录作为"根"目录,通常用于打包 |
默认为空 |
zlib zlib-dynamic no-zlib |
使用静态的zlib压缩库 使用动态的zlib压缩库 不使用zlib压缩功能 |
|
threads no-threads |
是否编译支持多线程的库 |
默认支持 |
shared no-shared |
生成动态连接库 生成静态库 |
|
asm no-asm |
是否在编译过程中使用汇编代码加快编译过程 |
|
enable-sse2 no-sse2 |
启用/禁用SSE2指令集加速。如果你的CPU支持SSE2指令集,就可以打开,否则就要关闭 |
|
gmp no-gmp |
启用/禁用GMP库 |
|
rfc3779 no-rfc3779 |
启用/禁用实现X509v3证书的IP地址扩展 |
|
krb5 no-krb5 |
启用/禁用 Kerberos 5 支持 |
|
ssl no-ssl ssl2 ssl3 no-ssl2 no-ssl3 tls no-tls |
启用/禁用 SSL(包含了SSL2/SSL3) TLS 协议支持。 |
|
dso no-dso |
启用/禁用调用其它动态链接库的功能。[提示]no-dso仅在no-shared的前提下可用。 禁用选项 |
|
no-md2 no-md4 no-mdc2 no-ripemd
|
摘要算法 |
|
no-des no-rc2 no-rc4 no-rc5 no-idea no-bf no-cast no-camellia
|
对称加密算法 |
|
no-ec no-dsa no-ecdsa no-dh no-ecdh |
不对称加密算法 |
|
no-comp |
数据压缩算法 |
|
no-store |
对象存储功能 |
|
本文使用的软件打包下载地址:
百度网盘 提取码:m6zy
本文pdf下载:
链接:https://pan.baidu.com/s/1MsZhkXfbfEavn80bnNTsyg
提取码:ic00
复制这段内容后打开百度网盘手机App,操作更方便哦
上一章我们介绍了python中的列表,本章介绍其余三种数据结构:字典、集合和元组。1、字典字典有两个特点:其一,字典是由大括号{}包围的;其二,字典的每一个元素的模式都是“键:值”,而不是“键=值”,两个元素之间用逗号,隔开。注意,字典初始化的顺序不会保持,在初始化后,再次查看字典时,元素顺序可能变化。一般访问字典的数据时,使用中括号记法,中括号中是键,使用键来访问其关联的数据值。..._结构化数据处理方法
Linux PCI桥驱动程序源码发表于:2007-05-26来源:作者:点击数:标签:在网上有很多介绍 Linux 驱动程序 开发 的文章,看下来,很多写的不尽完善,找了一下Linux的内核源码,将其贴出共享,也督促自己尽量的搞懂这些东西。 /* *Copyright (c) 2001 Red Hat, Inc. All rights reserved. * *This software may ..._linux pci 源码
JAVA——实现字节流练习之复制图片字节流练习之复制图片* * 数据源 : "E:\\develop\\Io流复制的图片\\liuyan.jpg"* 目的地 : "liuyan.jpg"代码如下:public class Demo4 { public static void main(String[] args) throws IOException { //..._字节流练习图片复制
/* *Copyright(c) 2016, 烟台大学计算机学院 *All rights reserved. *文件名称:建立单链表.cpp *作 者:孟琪琪 *完成日期:2016年 9月 22日 *问题描述:定义单链表存储结构,用头插法和尾插法建立单链表,并显示建立好以后的结果。 *输入描述:此程序没有输入。 *程序输出
Appium实现自动化底层是依赖UiAutomator框架,定位元素也是经由UiAutomator处理后转换Accessibility服务对象完成元素查找并且操作。在前面介绍过Appium-Desktop支持的ID、XPATH、ACCESSIBILITY_ID、CLASS_Name定位,对于这四种定位比较容易理解,剩下的ANDROID_UIAUTOMATOR定位在这篇文章介绍。一、疑问..._android_uiautomator
判断设备唯一性 if ((!deviceId.equals("0") && !schoolDeviceId.equals("0"))) { Optional<SchoolDevice> deviceOpt = deviceRepository.findById(Integer.parseInt(schoolDeviceId)); if (!device..._网页判断设备唯一性
本文总结记录Linux C中有关字符串的拼接方法,strncat 和 snprintf 函数_snprintf拼接字符串
2016年8月16日 星期二 --出埃及记 Exodus 16:17The Israelites did as they were told; some gathered much, some little.以色列人就这样行,有多收的,有少收的。转载于:https://www.cnblogs.com/billion-points/p/5776957.html...
在使用postman进行接口测试的时候,对于有些接口字段需要时间戳加密,这个时候我们就遇到2个问题,其一是接口中的时间戳如何得到?其二就是对于现在常用的md5加密操作如何在postman中使用代码实现呢?今天我们chrome插件网就为大家整理分享一下postman接口测试系列教程(二): 时间戳和加密。下面我们以一个具体的接口例子来进行说明。首先,postman接口的接口文档信息此接口文档中,需要..._postman application/x-www-form-urlencoded如何传时间
项目中遇到预览docx和pdf要求:在开发过程中webView支持预览pdf和docx,so直接使用webView,但在后期测试阶段发现部分docx预览时为乱码现象,查找方案发现编码utf-8以及GBK等都无法解决乱码问题。后发现如下方案能做修改:content-type 用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据,
根据官方代码行修改后:from pylab import *from numpy import *from PIL import Image# If you have PCV installed, these imports should workfrom PCV.geometry import homography, warpfrom PCV.localdescriptors im..._http://blog.csdn.net/shanghaiqianlun/article/details/12090595
Java对象初始化,对象初始化流程: 加载字节码(只加载一次)->初始化字段->父类构造方法->自身构造方法。_java 对象初始化