OPENSSL编译.TXT
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:4k
源码类别:

CA认证

开发平台:

Visual C++

  1. 前几天,为了给大家提供新版本的openssl,又重新做了一次openssl的编译工作,并比较了几种编译方法,写这个文章简单介绍一下,希望对大家有帮助。
  2.      我编译的版本是0.9.6h,编译器使用VC++6.0,根据它的说明,我进行了如下的命令和操作:
  3.      1.安装ActivePerl-5.6.1.629-MSWin32-x86-multi-thread.顺利通过!
  4.      2.打开控制台程序,在openssl解压后的目录下执行Perl Configure VC-WIN32命令,注意,一定要在这个目录下执行该命令,否则找不到Configure文件,当然,你也可以指定完整的Configure文件路径。顺利通过。
  5.      3.根据openssl的帮助说明,在解压目录下执行msdo_masm(和ms_do_ms)命令,成功通过。
  6.      4.配置VC环境变量,我在相同的控制台程序下转到VC所在目录下的vc98bin目录,执行vcvars32批处理命令,设置VC的环境变量,然后再转到openssl解压包的根目录下。
  7.      注意:我第一次运行Vcvars32的时候,报错,错误为:Out of environment space,这个错误的产生是因为你的MS-DOS环境变量没有分配足够的内存,这可以通过如下方法解决:
  8.      a.点击开始, 点击运行. 
  9.      b.输入sysedit后回车运行该程序. 
  10.      c.然后会出现多个窗口,选择Config.sys窗口. 
  11.      d.如果存在Shell= 的语句, 在其前面输入 REM ,即注释该语句. 
  12.      e.如果该语句不存在,就直接输入SHELL=C:COMMAND.COM /E:4096 /P ,注意,要保证该语句是从第一行第一个位置开始输入的。
  13.      f.保存、退出重新启动电脑就应该可以解决这个问题。
  14.      按上述方法解决这个问题之后,重新启动电脑后可以直接执行第4步。
  15.      5.在openssl解压目录下执行nmake -f msntdll.mak,如果没有错误,就完成编译了。输出的文件在out32dll里面,包括应用程序的可执行文件、两个Lib文件和两个dll文件。 
  16.      
  17.      我根据openssl的说明,做了两种不通的编译,一直是加了ASM汇编语言编译器,一直是没有,即在第三步的时候执行do_masm或do_ms命令,时间上前者大概为3分钟(我的电脑配置是图拉丁塞杨1.2,内存256SDRM),后者大概是6分钟的样子。
  18.      然后,我使用了第三方提供的一个编译方法,该方法自动配置了openssl各个模块的V虚拟C工程连接配置项目,然后再进行编译,速度很慢,用了至少20分钟以上的时间,但是好处是可以将一个一个项目弄的比较清楚,其编译过程我就不说了,大家可以参看相关的文档。
  19. certmgr.dll - 证书图标
  20. shell32.dll
  21. comres.dll - COM图标
  22. EvpClean()函数说明,此函数在程序销毁时候调用,否则在一个函数中调用过,即使下一个函数中重新加载了算法,也可能出现没有加密库的错误.
  23. 关于类型转换:
  24. 1. static_cast 
  25. 将一个值以合逻辑的方式转型.这可看做是"利用原值重建一个临时对象,并在设
  26. 立初值时使用型别转换".唯有当上述的型别转换有所定义,整个转换才会成功.
  27. 所谓的"有所定义",可以是语言内建规则,也可以是程序员自定的转换动作.
  28. 例如: 
  29. float x; 
  30. ... 
  31. cout << static_cast(x); // print x as int 
  32. ... 
  33. f(static_cast("hello")); // call f() for string instead of char* 
  34. 2. dynamic_cast 
  35. 将多态型别(polymorphic type)向下转型(downcast)为其实际静态型别(real static 
  36. type).这是唯一在执行期进行检验的转型动作.你可以用它来检验某个多态对象
  37. 的型别,例如: 
  38. class Car; // abstract base class (has at least one virtual function) 
  39. class Cabriolet : public Car { 
  40. ... 
  41. }; 
  42. class Limousine : public Car { 
  43. ... 
  44. }; 
  45. void f(Car* cp) 
  46. Cabriolet* p = dynamic_cast(cp); 
  47. if (p == NULL) { 
  48. // did not refer to an object of type Cabriolet 
  49. ... 
  50. 在这个例子中,面对实际静态型别为Cabriolet的对象,f()有特殊应对行为.当
  51. 参数是个reference,而且型别转换失败时,dynamic_cast丢出一个bad_cast异
  52. 常(bad_cast的描述见p26).注意,以设计角度而言,你应该在运用多态技术的
  53. 程序中,避免这种 "程序行为取决于具体型别"的写法. 
  54. 3. const_cast 
  55. 设定或去除型别的常数性(constness),亦可去除volatile饰词.除此之外不允
  56. 许任何转换. 
  57. 4. reinterpret_cast 
  58. 此操作符的行为由实际编译器定义.可能重新解释bits意义,但也不一定如此.使
  59. 用此一转型动作通常带来不可移植性. 
  60. 这些操作符取代了以往小圆括号所代表的旧式转型,能够清楚阐明转型的目的.小圆括
  61. 号转型可替换dynamic_cast之外的其它三种转型,也因此当你运用它时,你无法明
  62. 确显示使用它的确切理由.这些新式转型操作符给了编译器更多信息,让编译器清楚知
  63. 道转型的理由,并在转型失败时释出一份错误报告. 
  64. 注意,这些操作符都只接受一个参数.试看以下例子: 
  65. static_cast(15,100) // Oops, creates Fraction(100) 
  66. 在这个例子中你得不到你想要的结果.它只用一个数值100,将Fraction 暂时对象
  67. 设定初值,而非设定分子15,分母100.逗号在这里并不起分隔作用,而是形成一个 
  68. comma(逗号)操作符,将两个表达式组合为一个表达式,并传回第二表达式做为最终
  69. 结果.将15和100"转换"为分数的正确做法是: 
  70. Fraction(15,100) // fine, creates Fraction(15,100)
  71. CImageList::SetOverlayImage可以设置重叠图标,比如在一个图标上面加上一个感叹号
  72. //隐藏不活动图标
  73. HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerTrayNotify