在 Borland C++ Builder、Win 8.1 下构建 OpenSSL

Building OpenSSL under Borland C++ Builder, Win 8.1

我正在按照 INSTALL.W32(各种 OpenSSL 版本)的说明进行操作,通常是:

 * Configure for building with Borland Builder:
   > perl Configure BC-32

 * Create the appropriate makefile
   > ms\do_nasm

 * Build
   > make -f ms\bcb.mak

现在,我在尝试构建时遇到了两种错误:

对于 OpenSSL < 1.0.0

nasmw -f obj -d__omf__ -ocrypto\md5\asm\m5_win32.obj .\crypto\md5\asm\m5_win32.asm
'nasmw' is not recognized as an internal or external command,
operable program or batch file.

否则

Warning W8017 C:\CBuilder5\Include\sys/stat.h 34: Redefinition of 'S_IFMT' is not identical
Warning W8017 C:\CBuilder5\Include\sys/stat.h 35: Redefinition of 'S_IFDIR' is not identical
Error E2227 .\crypto\rand\randfile.c 226: Extra parameter in call to _open in function RAND_write_file
Warning W8053 .\crypto\rand\randfile.c 262: '_chmod(const signed char *,int,...)' is obsolete in function RAND_write_file
*** 1 errors in Compile ***

是的,我对使用 Borland C++ Builder 5 感到遗憾,但我对此无能为力,是的,如果其他一切都失败了,我会考虑 Shining Light 选项。

我不使用 OpenSSL,但从您的文本中得到了一些提示:

  1. NASM

    • 不是 Borland 编译器的默认汇编器
    • 需要先下载安装
    • (它是免费的,是我过去用过的最好的编译器之一)
  2. 您在包含 OpenSSL 或包含顺序错误之前遗漏了一些 #define

    • 这就是为什么您收到第一个警告并且很可能还有错误
    • 一些库需要添加配置#defines(由一些特定的IDE添加)
    • 指定使用什么编译器、平台、endianess...
    • 在任何包含之前
    • 通常如果你以错误的顺序包含,那么定义是为 lib 文件的某些实例定义的,而不是为所有实例定义的
    • 所以尝试重新排序包含
    • 有时有助于在 lib 之前包含一些其他东西,如 conio、stdio、windows、...
    • 确定哪个定义丢失或错误打开stat.h
    • 并在 S_IFMT
    • 周围寻找 #ifdef #ifndef 语句

最新版本 (1.0.2d) 的解决方案是:

  1. 从 randfile 中删除额外的参数(如评论所述,这是不必要的),
  2. 编辑 ms\bcb.mak,搜索 -DMD5_ASM -DSHA1_ASM -DRMD160_ASM 并更改为 -DMD5_NO_ASM -DSHA1_NO_ASM -DRMD160_NO_ASM 。 (SHA、MD5、RMD160有未解决的外部错误,基本上不能用asm编译)

还包括一些其他步骤,但它们仅针对我的环境。