这几天需要使用openssl,前期本机上保存的目录不知道哪天整理的时候删除了,索性下载最新的自己编译一下;

在最新版的openssl(openssl-1.0.2e),编译过程中出现了很多问题,这里主要汇总一下:

使用环境:win10/VC2015

1、如何编译unicode 版openssl?

在配置时添加选项:

perl Configure VC-WIN32 -DUNICODE -D_UNICODE

 

2、如何使得编译的openssl库在debug程序时不报错?

修改ms\do_xx.bat文件即可,如下所示,加上deubg就会生成*.dbg输出目录,否则生成release版本

perl util\mk1mf.pl debug no-asm VC-WIN32 >ms\nt.mak

3、如何生成静态库?

nmake -f ms\ntdll.mak

nmake -f ms\nt.mak

后一项编译生成静态库

4、编译库可能存在以下问题:

1>libeay32.lib(cryptlib.obj) : error LNK2001: 无法解析的外部符号 __vsnwprintf
1>libeay32.lib(cryptlib.obj) : error LNK2001: 无法解析的外部符号 __vsnprintf
1>libeay32.lib(cryptlib.obj) : error LNK2001: 无法解析的外部符号 ___iob_func
1>libeay32.lib(pem_lib.obj) : error LNK2001: 无法解析的外部符号 ___iob_func
1>libeay32.lib(ui_openssl.obj) : error LNK2001: 无法解析的外部符号 ___iob_func
1>libeay32.lib(v3_utl.obj) : error LNK2001: 无法解析的外部符号 _sscanf
1>libeay32.lib(dso_win32.obj) : error LNK2001: 无法解析的外部符号 _sprintf

以下是解决方法:

对于1.2个问题是由于_vsntprintf在系统库中已经有定义了,所以先注掉cryptlib.c中的定义,然后再把_vsntprintf 使用的地方用UNICODE宏区分开,见如下所示:

 /*
# if defined(_UNICODE) || defined(__UNICODE__)
# define _vsntprintf _vsnwprintf
# else
# define _vsntprintf _vsnprintf
# endif
*/ ...... #if defined(_UNICODE) || defined(__UNICODE__)
_vsnwprintf(buf, sizeof(buf) / sizeof(TCHAR) - , fmt, ap);
#else
_vsnprintf(buf, sizeof(buf) / sizeof(TCHAR) - , fmt, ap);
#endif //#if defined(_UNICODE) || defined(__UNICODE__)

  对于3.4.5三个问题(___iob_func)是由于VC++2015对此宏的定义不一样导致的,需要修改的地方是e_os.h文件

 #   if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin)
# if _MSC_VER>= && _MSC_VER< # undef stdin
# undef stdout
# undef stderr
FILE *__iob_func();
# define stdin (&__iob_func()[])
# define stdout (&__iob_func()[])
# define stderr (&__iob_func()[])
11 # elif _MSC_VER>1800 /*VC2015*/
12 FILE *__acrt_iob_func(unsigned)
13 # define stdin (__acrt_iob_func(0))
14 # define stdout (__acrt_iob_func(1))
15 # define stderr (__acrt_iob_func(2))
# elif _MSC_VER< && defined(I_CAN_LIVE_WITH_LNK4049)
# undef stdin
# undef stdout
# undef stderr
/*
* pre-1300 has __p__iob(), but it's available only in msvcrt.lib,
* or in other words with /MD. Declaring implicit import, i.e. with
* _imp_ prefix, works correctly with all compiler options, but
* without /MD results in LINK warning LNK4049: 'locally defined
* symbol "__iob" imported'.
*/

第6个问题,修改v3_utl.c

 #if defined(_UNICODE) || defined(__UNICODE__)
if (wscanf(in, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) != )
#else
if (sscanf(in, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) != )
#endif //

第7个问题,修改dso_win32.c

 #if defined(_UNICODE) || defined(__UNICODE__)
if (transform)
wprintf(translated, "%s.dll", filename);
else
wprintf(translated, "%s", filename);
#else
if (transform)
sprintf(translated, "%s.dll", filename);
else
sprintf(translated, "%s", filename);
#endif //#if defined(_UNICODE) || defined(__UNICODE__)

 5、编译过程中的其它问题都可以在网上直接找到,如nasm的问题等。

 

openssl unicode编译以及VC++2015环境下的问题的更多相关文章

  1. 编译mapnik(win7 环境下vs2008编译mapnik 0.7.1 成功)

    编译mapnik(win7 环境下vs2008编译mapnik 0.7.1 成功) ------by  wangsh 2012.02.22 Mapnik 是一个开源的 Python/C++ 地图渲染引 ...

  2. 【LDAP安装】在已编译安装的PHP环境下安装LDAP模块

    在已编译安装的PHP环境下安装LDAP模块 (乐维温馨提示:其他模块也能以这个方式安装) 1.在PHP源码包内找到ldap模块文件 cd php-5.6.37 cd ext/ldap/ 2.phpiz ...

  3. 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)

    版本:第一版 作者:毛鹏 杨帅 日期:20151108 简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC#环境下进行温 ...

  4. 编译出arm Android环境下的C++可执行文件

    要想编译出arm环境的C++可执行文件主要就是利用交叉编译器进行编译.编译过程本身都大同小异. 1.安装交叉编译器,交叉编译器的安装方法大致有下面几种: A.debian/ubuntu 系统可以直接输 ...

  5. kerberos环境下spark消费kafka写入到Hbase

    一.准备环境: 创建Kafka Topic和HBase表 1. 在kerberos环境下创建Kafka Topic 1.1 因为kafka默认使用的协议为PLAINTEXT,在kerberos环境下需 ...

  6. VB6.0环境下的CATIA二次开发简介

    CATIA作为CAD/CAE/CAM/PDM一体化的软件,广泛用于航空航天.汽车.船舶及电子工业,尤其在航空航天业,有八成以上厂商使用CATIA的市场[11].然而由于使用习惯和使用的侧重点不用,功能 ...

  7. Windows环境下使用VS2005编译OpenSSL

    如何Windows环境下,使用VS2005编译OpenSSL,虽然这个问题在Baidu.Google上一堆,但安装中还是遇到些问题,在这里 记录下来希望能帮助大家不要在走弯路.注:我是在WinXP S ...

  8. Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)

    https://blog.csdn.net/shinesun001/article/details/54312402 在centos 7环境下搭建好Lnmp环境之后,发现安装的php有好多扩展都没有安 ...

  9. VC 编程ANSI环境下读写Unicode文件

    没有注意到文件编码的不同会产生这么多的问题,在动手以前查询了很多资料,在本博客中收藏了不少先辈的成果,在这里一并表示致敬!       关于ANSI和Unicode编码的原理在这里也不说了,主要讲下如 ...

随机推荐

  1. 使用nssm将bat文件注册为windows service (eg:solr, nodejs)

    nssm下载:http://pan.baidu.com/s/1sjAEevj _install.bat @echo off Set BasePath=D:\Tools %BasePath%\nssm- ...

  2. 5.vue解决动态img :src绑定

    前言: 因为静态资源在vue中是需要经过编译的, 所以动态拼接的图片地址,在:src的时候不经过编译. 就会发生图片404,找不到资源. 那么本地图片资源如何动态的绑定呢? 实践: 其实,真相往往就是 ...

  3. Spring 框架配置web.xml 整合web struts

    package cn.itcast.e_web; import java.io.IOException; import javax.servlet.ServletContext; import jav ...

  4. 【学时总结】◆学时·VII◆ 高维DP

    ◆学时·VII◆ 高维DP 自学之余,偶遇DP…… ◇ 算法概述 顾名思义——一种处理多方面状态的DP,这种DP特点是……每一维的大小都不算太大(不然用dp数组存储下来内存会炸),而且枚举时容易超时… ...

  5. DNS介绍与安装使用

    DNS简介 DNS是互联网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS使用TCP和UDP的53号端口. DNS服务的基本概念 在使用DNS前需要了解 ...

  6. ubuntu16 升级pip3后报错File "/usr/bin/pip3", line 9, in <module> from pip import main ImportError: cannot import name 'main'

    问题:ubuntu16 执行pip3 install --upgrade pip之后,pip3执行出错. Traceback (most recent call last): File "/ ...

  7. Docker自学纪实(二)Docker基本操作

    安装docker 以CentOS7为例: 安装:yum -y install docker 启动:systemctl start docker 设置开机自启:systemctl enable dock ...

  8. 获取父窗口元素或者获取iframe中的元素(相同域名下)

    jquery方法 在父窗口中获取iframe中的元素 //方法1 $("#iframe的ID").contents().find("iframe中的元素"); ...

  9. 【c学习-5】

    int main(){ //二维数组的应用 int i,j; int a[2][3]; for(i=0;i void myFunction(){ int a[3]; int i; int max; f ...

  10. 【JavaScript】jQuery绑定事件

    jquery中直接绑定事件:只能用在程序中一开始就存在的html代码 目标元素.click(function(){ }) jquery中间接绑定事件: 如果目标元素是js生成的,则需要间接绑定事件,用 ...