Visual Studio 2019编译 OpenSSL x86/64 static/dynamic

2024-01-23 22:56:56 559

最近有需要, 需要openssl支持

1. 下载源码

我下的是openssl-1.0.1o, https://www.openssl.org/source/old/

2. 安装Perl

https://strawberryperl.com/download/5.26.3.1/strawberry-perl-5.26.3.1-64bit-portable.zip

perl/bin 加个环境变量

3. 编译安装

perl Configure VC-WIN32 no-asm

VC-WIN64I代表目标是64位库,VC-WIN32 代表是32位库,no-asm 编译过程中不使用汇编代码加快编译过程VC-WIN32(32位) | VC-WIN64A(64位AMD) | VC-WIN64I(64位Intel) | VC-CE(Windows CE)prefix 为安装目录

ms\do_ms

64位用这个ms\do_win64a

nmake -f ms\nt.mak

nmake -f ms\ntdll.mak (ntdll 代表动态库,nt 代表静态库)

运行后提示这个

cl: 命令行 warning D9035 :“O”选项已否决,并将在将来的版本中移除
o_str.c
.\crypto\o_str.c(67): fatal error C1083: 无法打开包括文件: “strings.h”: No such file or directory

定位到这个文件

#if !defined(OPENSSL_IMPLEMENTS_strncasecmp) && \
    !defined(OPENSSL_SYSNAME_WIN32) && \
    !defined(NETWARE_CLIB)
# include <strings.h>
#endif

ms/nt.mak内, 在CFLAG= 后加上-DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN 即可

继续运行nmake -f ms\nt.mak

又报错

constant_time_test.c
        link /nologo /subsystem:console /opt:ref /debug /out:out32\constant_time_test.exe @C:\Users\root\AppData\Local\Temp\nm8146.tmp
constant_time_test.obj : error LNK2019: 无法解析的外部符号 ___iob_func,函数 _main 中引用了该符 号
out32\constant_time_test.exe : fatal error LNK1120: 1 个无法解析的外部命令

查看代码文件e_os.h 318行存在如下定义

#    if _MSC_VER>=1300
#     undef stdin
#     undef stdout
#     undef stderr
FILE *__iob_func();
#     define stdin  (&__iob_func()[0])
#     define stdout (&__iob_func()[1])
#     define stderr (&__iob_func()[2])
#    elif defined(I_CAN_LIVE_WITH_LNK4049)

__iob_func在VS2019没有了

实际上VS已经定义了宏stdin,stdio,stderr,直接使用VS定义也是可以的。

VS2019中对stdin,stdio,stderr的定义如下:

_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);

#define stdin (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))

将openssl 源码目录删掉, 以上步骤重来一遍, 直到nmake -f ms\nt.mak前, 更改对应文件

为了保持openssl代码的一致,修改e_os.h 318代码如下:

#    if _MSC_VER>=1900
#     undef stdin
#     undef stdout
#     undef stderr
FILE*  __acrt_iob_func(unsigned);
#     define stdin  (__acrt_iob_func(0))
#     define stdout (__acrt_iob_func(1))
#     define stderr (__acrt_iob_func(2))
#    elif _MSC_VER>=1300 && _MSC_VER<1900
#     undef stdin
#     undef stdout
#     undef stderr

或者直接使用VS对宏的定义

#    if _MSC_VER>=1300 && _MSC_VER<1900
#     undef stdin
#     undef stdout
#     undef stderr

nmake -f ms\nt.mak install

nmake -f ms\nt.mak test

同样注意 nt/ntdll

最终输出

passed all tests

即编译安装完成

最终安装在了

D:\usr\local\ssl\lib



1.0.2

perl Configure VC-WIN32 no-asm no-shared --prefix=d:\openssl_lib

ms\do_ms

nmake -f ms\nt.mak

nmake -f ms\nt.mak install

32位release模式的静态库

perl Configure VC-WIN32 no-asm --prefix = "d:\openssl-101\32releaseLib"
ms\do_ms
nmake -f ms\nt.mak
nmake -f ms\nt.mak install
nmake -f ms\nt.mak test

32位debug模式的静态库

perl Configure debug-VC-WIN32 no-asm --prefix = "d:\openssl-101\32debugLib"
ms\do_ms
nmake -f ms\nt.mak
nmake -f ms\nt.mak install
nmake -f ms\nt.mak test

32位release模式的动态库

perl Configure VC-WIN32 no-asm --prefix = "d:\openssl-101\32releaseDll"
ms\do_ms
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak install
nmake -f ms\ntdll.mak test

32位debug模式的动态库

perl Configure debug-VC-WIN32 no-asm --prefix = "d:\openssl-101\32debugDll"
ms\do_ms
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak install
nmake -f ms\ntdll.mak test

64位release模式的静态库

perl Configure VC-WIN64A no-asm --prefix = ""d:\openssl-101\64releaseLib
ms\do_win64a
nmake -f ms\nt.mak
nmake -f ms\nt.mak install
nmake -f ms\nt.mak test

64位debug模式的静态库

perl Configure debug-VC-WIN64A no-asm --prefix = "d:\openssl-101\64debugLib"
ms\do_win64a
nmake -f ms\nt.mak
nmake -f ms\nt.mak install
nmake -f ms\nt.mak test

64位release模式的动态库

perl Configure VC-WIN64A no-asm --prefix = "d:\openssl-101\64releaseDll"
ms\do_win64a
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak install
nmake -f ms\ntdll.mak test

64位debug模式的动态模式

perl Configure debug-VC-WIN64A no-asm --prefix = "d:\openssl-101\64debugDll"
ms\do_win64a
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak install
nmake -f ms\ntdll.mak test

1.1.0

1.1.0及以后的版本更简单

perl Configure VC-WIN32 no-asm no-shared

nmake

nmake test

nmake install

即可


Visual Studio 2019编译 OpenSSL x86/64 static/dynamic

最近有需要, 需要openssl支持1. 下载源码我下的是openssl-1.0.1o, https://www.openssl.org/source/old/2. 安装Perlhttps://strawberryperl.com/download/5.26.3.1/strawberry-perl-
2024-01-23

CMake 链接 OpenSSL 静态库

示例CMakeLists.txt如下cmake_minimum_required(VERSION 3.5) project(test CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unu
2022-08-23

freemarker 时间显示不正常 设置时区

项目在本地开发的时候显示正常,部署上服务器就一直差8个小时,最后发现freemarker官方文档有这样的说明time_zone:时区的名称来显示并格式化时间。 默认情况下,使用JVM的时区。 也可以是 Java 时区 API 接受的值,或者 "JVM default" (从 FreeMarker 2
2020-03-28
IDEA 2019.1 xml 不高亮

IDEA 2019.1 xml 不高亮

前几天更新了idea后,发现xml里的代码都没有了高亮,变得跟记事本一个德性了打开setting ,搜索 File Types,找到xml项, 查看下方的匹配格式,果然没有xml,(idea真是厉害)点击右方的+,输入*.xml,点击ok,解决问题
2020-03-28

npm install 淘宝镜像

npm install --registry=https://registry.npm.taobao.org
2020-03-28
Java中方法的参数传递机制

Java中方法的参数传递机制

来看一段代码 public class Man { private String name; private Integer age; public String getName() { return name; } publi
2020-03-28
基于自定义注解手写权限控制

基于自定义注解手写权限控制

方法一: AOP 方法二: 拦截器项目结构项目依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-w
2020-03-28

Docker 部署 详细全过程 附代码

Docker 部署本站 全过程环境:CentOS7.61. 安装Docker其他版本CentOS可以参考这个https://help.aliyun.com/document_detail/187598.html查看本机内核版本,内核版本需高于 3.10uname -r 确保 yum 包最新yum u
2020-03-28

SpringBoot 启动普通java工程

引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.9</version> </dependency>
2020-03-28

Vue.js DOM操作

<template> <input type="button" @click="reply($event)" value="回复"> </template> export default { methods: { replyFun(e) {
2020-03-29
CentOS7编译调试OpenJDK12

CentOS7编译调试OpenJDK12

1. 下载源码https://hg.openjdk.java.net/jdk/jdk12点击左侧的browse,再点击zip,就可以下载zip格式的源码压缩包。unzip xxx.zip 解压文件2. 安装jdkyum install java-11-openjdk-devel -y3. 运行con
2020-04-23
编写自己的Spring Boot Starter

编写自己的Spring Boot Starter

1.新建一个maven项目命名规则统一是xxx-spring-boot-starter完整pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
2020-06-29