openssl unicode编译以及VC++2015环境下的问题

这几天需要使用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宏区分开,见如下所示:

 1 /*
 2 # if defined(_UNICODE) || defined(__UNICODE__)
 3 # define _vsntprintf _vsnwprintf
 4 # else
 5 # define _vsntprintf _vsnprintf
 6 # endif
 7 */
 8
 9 ......
10
11 #if defined(_UNICODE) || defined(__UNICODE__)
12 _vsnwprintf(buf, sizeof(buf) / sizeof(TCHAR) - 1, fmt, ap);
13 #else
14 _vsnprintf(buf, sizeof(buf) / sizeof(TCHAR) - 1, fmt, ap);
15 #endif //#if defined(_UNICODE) || defined(__UNICODE__)

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

 1 #   if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin)
 2 #    if _MSC_VER>=1300 && _MSC_VER<1600
 3
 4 #     undef stdin
 5 #     undef stdout
 6 #     undef stderr
 7 FILE *__iob_func();
 8 #     define stdin  (&__iob_func()[0])
 9 #     define stdout (&__iob_func()[1])
10 #     define stderr (&__iob_func()[2])
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))
16 #    elif _MSC_VER<1300 && defined(I_CAN_LIVE_WITH_LNK4049)
17 #     undef stdin
18 #     undef stdout
19 #     undef stderr
20          /*
21           * pre-1300 has __p__iob(), but it‘s available only in msvcrt.lib,
22           * or in other words with /MD. Declaring implicit import, i.e. with
23           * _imp_ prefix, works correctly with all compiler options, but
24           * without /MD results in LINK warning LNK4049: ‘locally defined
25           * symbol "__iob" imported‘.
26           */

第6个问题,修改v3_utl.c

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

第7个问题,修改dso_win32.c

 1 #if defined(_UNICODE) || defined(__UNICODE__)
 2     if (transform)
 3         wprintf(translated, "%s.dll", filename);
 4     else
 5         wprintf(translated, "%s", filename);
 6 #else
 7     if (transform)
 8         sprintf(translated, "%s.dll", filename);
 9     else
10         sprintf(translated, "%s", filename);
11 #endif //#if defined(_UNICODE) || defined(__UNICODE__)

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

时间: 2024-08-14 23:20:34

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

在vs 2015环境下,c语言和汇编混编操作简析(更新中......)

在VS 2015环境下如何混编. 在新建工程里也会发现了很多问题, 应用程序类型分为:windows应用程序,控制台应用程序,DLL,静态库 静态库: 静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库. 程序编译一般需经预处理.编译.汇编和链接几个步骤.静态库特点是可执行文件中包含了库代码的一份完整拷贝:缺点就是被多次使用就会有多份冗余拷贝. 静态库和动态库是两种共享程序

VS2015报错:值不能为null参数名:solutionDirectory(visual studio 2015环境下运行C/C++)

解决以下问题: 1.null问题 2.vs2015下运行C/C++ 当用vs2015直接打开.c/.cpp文件,运行明显正确的程序时,会出行null情况. 解决方法:只需按正确方式打开VS2015的C++模块即可. 具体方法如下:如果已正确安装C++模块直接转--4 1.如果您在安装VS2015时选择了默认安装方式,将不具备Visual C++,那么,首先打开软件,然后点击新建项目,选择Visual C++ 2.出现两个安装选项 安装不是"安装通用window平台工具"的另一个. 3.

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

要想编译出arm环境的C++可执行文件主要就是利用交叉编译器进行编译.编译过程本身都大同小异. 1.安装交叉编译器,交叉编译器的安装方法大致有下面几条: A.debian/ubuntu 系统可以直接输入命令安装: sudo apt install g++-arm-linux-gnueabihf sudo apt install g++-8-arm-linux-gnueabihf #这种方式还可以指定版本 B.直接下载交叉编译器的二进制文件,arm官网下载地址,这个网站的下载速度比较慢,可以bai

Windows环境下使用VS2005编译OpenSSL

如何Windows环境下,使用VS2005编译OpenSSL,虽然这个问题在Baidu.Google上一堆,但安装中还是遇到些问题,在这里 记录下来希望能帮助大家不要在走弯路.注:我是在WinXP SP3下使用VS2005SP1下编译成功的,OpenSSL的版本是0.9.8l. http://www.cnblogs.com/moonset7/archive/2009/12/18/1627317.html by 月落上弦 一.编译OpenSSL  准备工作:下载OpenSSL源码 官方网站下载Op

VS2008环境下CEGUI 0.7.1及相关工具的编译(转载 + 额外的注意事项)

原文地址:http://blog.sina.com.cn/s/blog_6841a32d0100jtcw.html 作者:孩儿他爹 一.概述 对于游戏的界面开发而言,CEGUI是一个不错的选择.但是CEGUI及其相关工具用到了很多第三方库,从而导致编译步骤比较复杂,让新人无从下手.所以我在这里介绍一下CEGUI 0.7.1 以及 CEImagesetEditor 和 CELayoutEditor 的编译.希望能够对准备学习CEGUI的童鞋们有所帮助:) 二.准备 我们需要用到 0. Direct

【应用笔记】【AN003】VC++环境下基于以太网的4-20mA电流采集

简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC++环境下进行温度采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成及工作原理 系统组成主要包括PT100铂电阻.SBWZ温度变送器.4-20mA电流采集模块(GM4008)以及上位机软件组成,如图1所示. PT100铂电阻温度传感器:利用铂金属阻值随温度的变化而变化的特性制成的一种温度传感器,主要用来测量温度的变化量. SBWZ温度变送器:一种现场安装

从零教你在Linux环境下(ubuntu)如何编译hadoop2.4

问题导读: 1.如果获取hadoop src  maven包?2.编译hadoop需要装哪些软件?3.如何编译hadoop2.4?扩展:编译hadoop为何安装这些软件? 本文链接 http://www.aboutyun.com/thread-8130-1-1.html 一.首先下载hadoop源码包下载的方式还是比较多的1.svn的方式svn下载首先需要安装SVN,如果想尝试使用svn,可以参考源码管理.获取网络源码工具:TortoiseSVN使用手册,hadoop的svn下载地址点此2.压缩

VC++环境下多文档模板应用程序开发(带源码)

我们以前见到的关于VC++环境下利用APP Wizard 自动生成的MDI的应用程序只支持打开同一文档类型的多个文件,但是不能够同时打开不同种类型的文档.网上的这种公开资料比较少,我在知网上查阅了相关的资料.下面我根据这些资料做一下总结(辛辛苦苦一个一个字码出来的). 下面设计一个能够处理两种文档类型的应用程序:第一种文档类型:TXT文档,第二种文档类型:Bub的文档类型. 第一种的文档类型TXT,是利用APP Wizard自动生成的,只不过是在设置的时候将文档类型设置为TXT类型,并且使生成的

windows环境下使用apxs编译添加apache模块

windows环境下使用apxs编译添加apache模块 简介说明:本文使用mod_limitipconn模块为例. 环境: windows7 x86系统 apache 2.4.18 目标: 在windows环境下,利用mod_limitipconn0.24源码.apxs为apache2.4.18添加mod_limitipconn模块. 分析: limitipconn模块最新版已经支持apache2.4了.但是没有编译好的对应版本.因此需要自己动手编译模块.在windows下要实现这个目标,需要