天天看点

Windows下Openssl1.0.0d安装以及编程

必备条件:

1、安装VC++ 6.0。

2、需要perl的支持,下载ActivePerl并安装: http://downloads.activestate.com/ActivePerl/releases/5.12.4.1205/ActivePerl-5.12.4.1205-MSWin32-x86-294981.msi

3、下载 Openssl1.0.0d并解压,当然是必不可少的。

http://www.openssl.org/source/openssl-1.0.0d.tar.gz

安装步骤:

1、运行cmd,切换到openssl目录,perl Configure VC-WIN32

如不成功会有明显提示

2、下面三个命令选一个就行了

     ms\do_ms 推荐使用这种方式 另外两种方式 如果使用也必须保证本机有编译器才能使用。

    :ms\do_masm (默认vc 自带的编译器;也也以自己下载安装,我用的这个,因为我用其他的没成)

    :ms\do_nasm (需要自己下载)

3、vcvars32.bat 以配置环境变量。

4、nmake -f ms\ntdll.mak 如果编译成功,最后的输出都在out32dll目录下:包括可执行文件、两个dll和两个lib文件: libeay32.dll, libeay32.lib, ssleay32.dll, ssleay32.lib(我编译的时候出现了这个错误

    'ml' 不是内部或外部命令,也不是可运行的程序

     或批处理文件。

     NMAKE : fatal error U1077: 'ml' : return code '0x1'

     Stop.

    大家应该一看就知道问题所在,解决很容易,把VC下的ml.exe复制到当前目录即可。但是有些人安装VC后没有ml.exe,这个也好解决,下载一个MASM8.0,我下载下来名字是MASMsetup.exe,不用安装,按下面来:

1、用winrar解压安装文件MASMsetup.EXE,得到Setup.exe

2、用winrar解压Setup.exe,得到vc_masm1.cab

3、用winrar解压vc_masm1.cab,得到一个文件,文件名很长,改名为ml.exe就行了。

再次编译,可能还会出现如下错误:

fatal error LNK1103: debugging information corrupt; recompile module

openssl link return code 0x44f

这个错误产生的原因是:

随着VC7/VC8中新的debug信息格式和一些安全检查机制的导入,在VC6上使用这些库的Debug版本的时候

就会产生如题的链接错误。具体而言,你可能在VC6上使用了XP SP2,Windows 2003或者Windows 2003 R2

版本的SDK。

解决办法:

1.用Release版编译,不过这样就没法调试了。

    打开ntdll.mak,找到这一行

    LFLAGS=/nologo /subsystem:console /opt:ref /debug

    修改最后的debug为release(我就是采用这个方法)

2.到Tool -> Options -> Directories(以VC6.0为例),将SDK的顺序放到最下边或者直接删掉较新SDK

   的Directories:包括Include files和Library files。(我试过,好像不行)

3.如果你必须使用SDK中的新特性,那么找一个2004年之前的SDK吧。

   这里是最后一版支持VC6的SDK的下载地址:

   http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm

4.方便的话,干脆迁移到VC7/VC8。

应该就没有什么问题了。

编程初步:

1、 打开VC-Tools-Options-Directores,在Include files中增加【Openssl1.0.0d】\inc32目录;在Libray files中增加【Openssl1.0.0d】\out32dll

2、 在源程序中包含以下三个头文件并加入LIB:

#include <openssl/ssl.h>

#include <openssl/err.h>

#include <openssl/bio.h>

#pragma comment(lib, "libeay32.lib")

#pragma comment(lib, "ssleay32.lib")

以上是最简单的安装方式,但是不能使用静态库,生成的程序必须带着DLL文件才行,下面有另外一种安装方式:

    将源码释放在c:\Openssl1.0.0d目录中。

    进入openssl源码目录。

    cd c:\Openssl1.0.0d

    以下为参照该目录下的文件INSTALL.W32的执行过程:

    运行configure:

    perl Configure VC-WIN32 --prefix=c:/openssl

    创建Makefile文件:

    ms\do_ms

    清除上次静态库的编译,以便重新编译:

    nmake -f ms\nt.mak clean

    编译静态库:

    nmake -f ms\nt.mak(上面是ntdll.mak,同样修改debug为release)

使用静态库,只需在Libray files中修改【c:\Openssl1.0.0d】\out32dll 为【c:\Openssl1.0.0d】\out32

我遇到的一个问题,到网上找到了答案,记录如下:

--------------------Configuration: b64 - Win32 Release--------------------

Compiling...

b64.c

Linking...

MSVCRT.lib(MSVCRT.dll) : error LNK2005: __isctype already defined in LIBCMT.lib(isctype.obj)

MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fclose already defined in LIBCMT.lib(fclose.obj)

MSVCRT.lib(MSVCRT.dll) : error LNK2005: __errno already defined in LIBCMT.lib(dosmap.obj)

MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fflush already defined in LIBCMT.lib(fflush.obj)

MSVCRT.lib(MSVCRT.dll) : error LNK2005: _strncpy already defined in LIBCMT.lib(strncpy.obj)

MSVCRT.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in LIBCMT.lib(strchr.obj)

LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library

Release/b64.exe : fatal error LNK1169: one or more multiply defined symbols found

Error executing link.exe.

b64.exe - 7 error(s), 1 warning(s)

从错误信息可以看出是msvcrt.lib和libcmt.lib库中重复定义了__isctype等符号。为什么会出现这样的问题呢?这就要从这两个库的作用说起了。

msvcrt.lib是VC中的Multithreaded DLL 版本的C运行时库,而libcmt.lib是Multithreaded的运行时库。在同一个项目中,所有的源文件必须链接相同的C运行时库。如果某一文件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者Multithreaded版本的库,也就是说用了不同的库,就会导致这个警告的出现。

告警信息的意思我们明白之后,就要找造成这个问题的原因了。在项目设置中我们可以看到当前项目使用的是Multithreaded非DLL版本的运行时库,这说明项目中还有其他文件用到了不是这个版本的运行时库。很显然,就是openssl的静态库。查看openssl中ms下的nt.mak,我们可以发现静态库版本中openssl使用编译开关/MD进行编译的,也就是说openssl静态库是默认用的Multithreaded DLL 版本的C运行时库。

原因找到了。那么解决方法,很明显有两个。总之就是将两个项目的运行时库统一。

简单的方式就是将项目的动态库修改为使用Multithreaded DLL 版本的C运行时库即可。某些情况下你的项目可能不能改变当前的运行时库,你可以将openssl的nt.mak中的/MD开关修改为/MT然后重新编译openssl静态库就可以了。

VC中的C运行时库一共有6种,想了解更多信息可以参阅我先前翻译的文章。

Single-threaded (libc.lib)libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.libMultithreaded (libcmt.lib)libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.libMultithreaded using DLL (msvcrt.lib)libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.libDebug Single-threaded (libcd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.libDebug Multithreaded (libcmtd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.libDebug Multithreaded using DLL (msvcrtd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

现在发现修改为Release后,VC只能编译Release版本,暂时还是使用openssl-0.9.8r

    清除上次动态库的编译,以便重新编译:

    nmake -f ms\ntdll.mak clean

继续阅读