转自:http://blog.sina.com.cn/s/blog_68ee513e0100tnnx.html
1.下载 ActivePerl-5.8.0.806-MSWin32-x86 并安装
1) > perl Configure VC-WIN32
: 如不成功会有明显提示
2) > ms\do_ms
3)转到C:\Program Files\Microsoft Visual Studio\VC98\bin目录(默认安装时)下
执行 vcvars32.bat 以配置环境变量。
4)跳到openssl目录下
执行> nmake -f ms\ntdll.mak
:如果编译成功,最后的输出都在out32dll目录下 : 包括可执行文件 、两个dll和两个lib文件。
:
必备条件:
1、安装VC++ 6.0。
2、需要perl的支持,下载ActivePerl并安装:http://downloads.activestate.com/ActivePerl/releases/5.10.1.1007/ActivePerl-5.10.1.1007-MSWin32-x86-291969.msi
3、下载 openssl0.98并解压,当然是必不可少的。
http://www.openssl.org/source/openssl-0.9.8.tar.gz
安装步骤:
1、运行cmd,切换到openssl目录,perl Configure VC-WIN32
如不成功会有明显提示
2、下面三个命令选一个就行了
3、vcvars32.bat 以配置环境变量。
4、nmake -f ms\ntdll.mak 如果编译成功,最后的输出都在out32dll目录下:包括可执行文件、两个dll和两个lib文件: libeay32.dll, libeay32.lib, ssleay32.dll, ssleay32.lib(我编译的时候出现了这个错误
编程初步:
1、 打开VC-Tools-Options-Directores,在Include files中增加【openssl-0.9.8】\inc32目录;在Libray files中增加【openssl-0.9.8】\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文件才行,下面有另外一种安装方式:
使用静态库,只需在Libray files中修改【openssl-0.9.8】\out32dll 为【openssl-0.9.8】\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运行时库。
原因找到了。那么解决方法,很明显有两个。总之就是将两个项目的运行时库统一。