OpenSSL

ここでは OpenSSL に発生した問題点の回避方法について記載しています

Visual Studio 2015で未解決が発生する

OpenSSL 1.0.2f Win32版を使用して
Visual Studio 2015でC++のプログラムを作成すると
error LNK2001: 外部シンボル "___iob_func" は未解決です。
が発生しました
原因は、e_os.hの 320ラインの下記の定義にあります。

#   if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin)
#    if _MSC_VER>=1300 && _MSC_VER<1600
#     undef stdin
#     undef stdout
#     undef stderr
FILE *__iob_func();
#     define stdin  (&__iob_func()[0])
#     define stdout (&__iob_func()[1])
#     define stderr (&__iob_func()[2])
	   
__iob_func()の定義は、Visual Studio 2015の場合には、
#     define stdin  (__acrt_iob_func(0))
#     define stdout (__acrt_iob_func(1))
#     define stderr (__acrt_iob_func(2))
	   
のようになりますが Visual Studio 2015の_MSC_VERは、1900ですので
このソースの場合には、ソースを修正する必要はありませんが、
Visual Studio 2015にてOpenSSL 1.0.2fをソース
( https://www.openssl.org/source/openssl-1.0.2f.tar.gz) からコンパイルし直す事で、
リンクエラーは無くなります。
 
Visual Studio 2013では、正常にリンク出来ます。

ビルドについて

OpenSSL 1.0.2o Win32版のスタテックライブラリィのビルド方法について

Visual Studio Professional 2015 の場合

開発者コマンドプロンプト for VS2015 を実行後
OpenSSLサイト(https://www.openssl.org/source/)から openssl-1.0.2o.tar.gzをダウンロード後に解凍したフォルダに移動
Perlの実行環境を設定してあることを確認します
その後次のコマンドを入力すれば
perl Configure VC-WIN32 no-asm --prefix=C:\OpenSsl1.0.2o\Win32
call ms\do_ms
call ms\do_nt.bat
nmake -f ms\nt.mak install

実行終了後
C:\OpenSsl1.0.2o\Win32の中に生成されます

Visual Studio Professional 2017 の場合

開発者コマンドプロンプト for VS2017 を実行後は
Visual Studio Professional 2015と全く同じ操作になります

OpenSSL 1.0.2r の場合

OpenSSL 1.0.2rのソース( https://www.openssl.org/source/openssl-1.0.2r.tar.gz) の場合は、Visual Studio 2015,2017共に上記の設定で正常にコンパイル出来ました

OpenSSL 1.1.1b の場合

OpenSSL 1.1.1bのソース( https://www.openssl.org/source/openssl-1.1.1b.tar.gz) の場合は、Visual Studio 2015,2017共に
次のコマンドでコンパイル出来ました
perl Configure VC-WIN32 no-asm -static --prefix=C:\OpenSsl\Win32 --openssldir=SSL
nmake
nmake install
	   

Visual Studio Professional 2019 の場合

Developer Command Prompt for VS 2019 を実行後は
OpenSSL 1.0.2r
OpenSSL 1.1.1b 共に
Visual Studio Professional 2017と全く同じ操作になります