这几天需要使用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. java基础 final 修饰成员变量 只能赋值一次问题

    final int a; public Fu(){ a=1; }

  2. Mantle--国外程序员最常用的iOS模型&字典转换框架

    Mantle简介 Mantle是iOS和Mac平台下基于Objective-C编写的一个简单高效的模型层框架. Mantle能做什么 Mantle可以轻松把JSON数据.字典(Dictionary)和 ...

  3. react手动搭建解析

    1.创建项目名<react-progect> ->项目文件下创建package.json文件 ->项目下执行命令:cnpm initcnpm i webpack webpack ...

  4. linux连接FreeBSD虚拟机的mysql

    前言 本人菜鸟一枚,第一次写博客,不喜误喷. 实验环境 Opensuse15.0(主机).FreeBSD11.1(虚拟机).虚拟机VirtualBox5.2.22.mysql8.0.14 在FreeB ...

  5. 红帽CentOS7 密码破解

    1.在启动的时候按住方向键停留在内核选项页面,在内核选项出按e键 2.进入到另一个页面后,寻找到以linux16开头的地方,按end到行后,输入空格,然后输入rd.break console=tty0 ...

  6. PHP的IMAP函数

    imap_8bit -转换的8位字符串的引用,打印字符串 imap_alerts -返回所有的I MAP邮件警报已经发生 imap_append -附加了一系列的信息到指定邮箱 imap_base64 ...

  7. strak组件(6):列表定制列应用和引入静态文件

    效果图: 新增函数 def get_choice_text(title, field) 闭包函数,显示choice字段 def inner(self, obj=None, is_header=None ...

  8. 17-比赛1 C - Binary Nim (栈的游戏)

    题目描述 Tweedle-Dee 和 Tweedle-Dum 正在进行一场激烈的二进制 Nim 游戏.这是你没有玩过的船新版本,游戏包含 N 个栈,每个栈只包含 0 和 1 的元素.就像一般的 Nim ...

  9. zeppelin的安装与使用

    想起马上就能回家了,心情是按捺不住的激动,唉,还是继续努力吧,其实不希望那么快就回家,感觉回去了就意味着马上就要回来了,人真的是神奇呀 今天我们来使用zeppelin,这个就是可以把我们查找的数据可以 ...

  10. html+css调用服务器端字体

    在浏览网页时,由于客户端没有安装某些特殊字体,导致网页文字无法按设计正常显示,这时我们可以使用服务器字体来避免这种现象的发送 语法 @font-face { /* 自定义字体名称 */ font-fa ...