初版 04/02/2015 23:07:36
バッチファイルによるインストールの追加 04/09/2015 21:58:45
一括作成の方法を追加 04/19/2015 21:58:45

概要

OpenSLLはWindows/Linux/Macで使えるSSLをサポートしたライブラリである。
Visual C++で使用するにはソースからヘッダーファイルおよびソースをコンパイルしてライブラリファイルを作成する必要がある。
Visual C++でコンパイルおよび実行するために必要な作業について述べる。
また、複数のVisual C++のバージョンやWIN64・WIN32、リリース・デバック版を一括作成する方法を追記した。(2015/04/19)

テスト環境

コンパイラ

Visual C++ 2008 Express Version 9.0.30729.1 SP 32bit
Visual C++ 2008 Standard Version 9.0.30729.1 SP 32/64bit with OpenSSL 1.0.2a
Visual C++ 2013 Express Version 12.0.30110.00 Update 132bit/64bit with OpenSSL 1.0.2a

実行環境

Windows 7 Enterprise Service Pack 1 64bit
Windows 8.1 Enterprise 64bit

OpenSSLのヘッダーファイル・ライブラリファイル作成に必要なファイルのダウンロード・解凍

ヘッダーファイル・ライブラリファイルの作成にはPerlが必要です。
コンパイラのバージョンが異なる場合は、バージョンごとにライブラリファイルを作成する必要があります。

ActivePerlをインストール

ActivePerl is Perl for Windows, Mac, Linux, AIX, HP-UX & Solaris | ActiveState
上記よりFree Downloadを選び Version 5.20.1.2000 Windows Installer (MSI)をダウンロードし実行します。

OpenSSL をインストール

OpenSSL: Source, Tarball から openssl-1.0.2a.tar.gzをダウンロードする。
適当な解凍プログラム(Lhaplus Version 1.59(2010/10/14)or WinZIP 試用版など)を使用して解凍する。
Linuxが使える環境であれば、Linuxでダウンロードして解凍後にWindowsへコピーするのが簡単です。

ヘッダーファイルの作成及びソースコードをコンパイルしてライブラリファイルを作成する

OpenSSLのソースコードをコンパイルする

コマンドプロンプトに手入力でコマンドを入力して実行する方法とバッチファイル及び一括作成する使用した方法を示します。

手入力でコンパイルする

先ほど解凍したファイルをフォルダーごとコピーする。
スタートメニューからVisual Studio の コマンド プロンプトを実行する。
win32用のヘッダーファイルおよびスタティック版のRelease用のライブラリを作成する場合
d:¥temp32¥openssl-1.0.2aにopensslのダウンロードファイルを解凍結果が保存されており、D:¥win32にライブラリ及びヘッダファイルを作成する場合は以下の通りコマンドプロンプトに入力する。
d:
cd ¥temp32¥openssl-1.0.2a
perl Configure VC-WIN32 --prefix=D:¥win32 no-asm
ms¥do_ms
notepad ms¥nt.mak
nmake -f ms¥nt.mak
nmake -f ms¥nt.mak test
nmake -f ms¥nt.mak insatll
上記を実行すると途中でメモ帳が起動されます。
perlとdo_ms.batでコンパイル環境を整えnt.makにnmake用のmakefileが作成されます。
コンパイラオプション等を確認すると/Ziが定義されており、これはオブジェクトファイルにデバック情報を埋め込むオプションです。
デバック情報とはシンボル名やソースコードのことですが、リリース版では不要ですので、メモ帳で削除し上書きします。
nt.mak及びntdll.mak修正前
APP_CFLAG= /Zi /Fd$(TMP_D)/app
LIB_CFLAG=/Zl /Zi /Fd$(TMP_D)/lib
nt.mak及びntdll.mak修正後
APP_CFLAG= /Fd$(TMP_D)/app
LIB_CFLAG=/Zl /Fd$(TMP_D)/lib
nt.mak自動修正
perlを使って、notepadと記述している行を以下のように置き換えて自動的に削除することができます。
perl -l -p -e "s/^APP_CFLAG= ¥/Zi/APP_CFLAG= /g;" ms¥nt.mak > ms¥nt.1
perl -l -p -e "s/^LIB_CFLAG=¥/Zl ¥/Zi/LIB_CFLAG=¥/Zl/g;" ms¥nt.1 > ms¥nt.2
perl -l -p -e "s/^LIB_CFLAG= ¥/Zi ¥/Zi/LIB_CFLAG= /g;" ms¥nt.2 > ms¥nt.mak
ヘッダーファイル・ライブラリファイルの作成には私の環境(i7-3820)では実行に3分(コンパイラ SSD上、ソース HDD上)ほどかかりました。
ms¥do_msはバッチファイルなので、上記のコマンドプロンプトの内容をバッチファイルでまとめて実行するにはms¥do_msはcall文で呼び出します。
普通に呼び出すとms¥do_msを実行が終了する呼び出し元のバッチファイルに戻らないのでとnmakeが実行されません。
win32用のヘッダーファイルおよびDLL版やデバック版のライブラリを作成する場合
上記の着色部を以下のように変えるとDLL版やデバック版を作成することができます。
作成するライブラリ
Release DLL VC-WIN32 ntdll.mak
Release スタティック VC-WIN32 nt.mak
Debug DLL debug-VC-WIN32 ntdll.mak
Debug スタティック debug-VC-WIN32 nt.mak
リリース版を用いる場合は、ms¥ntdll.makファイルをスタティック版のRelease用と同様に修正する必要があります。
デバック版の場合、ms¥nt.mak及びms¥ntdll.makの修正せずにnmakeを実行すると、OpenSSLをリンクするときにはbr /> warning LNK4204: 'lib.pdb' に参照するモジュールのデバッグ情報がありません。デバッグ情報を無視してオブジェクトをリンクします。
といった警告が発生します。
これを回避するために、nt.mak及びntdll.makのLINKのオプションである以下の行の/debugを削除します。
nt.mak及びntdll.mak修正前
LINK=link
LFLAGS=/nologo /subsystem:console /opt:ref /debug
RSC=rc
nt.mak及びntdll.mak修正後
LINK=link
LFLAGS=/nologo /subsystem:console /opt:ref
RSC=rc
nt.mak自動修正
perlを使って、notepadと記述している行を以下のように置き換えて自動的に削除することができます。
perl -l -p -e "s/¥/debug$//g;" ms¥nt.mak > ms¥nt.1
copy ms¥nt.1 ms¥nt.mak 
win64b用のヘッダーファイルおよびスタティック版のDebug用のライブラリを作成する場合
Visual Studioの x64 Win64 コマンド プロンプトを実行します。
コマンドプロンプトへの入力内容
d:
cd ¥temp32¥openssl-1.0.2a
perl Configure VC-WIN64A --prefix=D:¥win64 no-asm
ms¥do_win64a
notepad ms¥nt.mak
nmake -f ms¥nt.mak
nmake -f ms¥nt.mak test
nmake -f ms¥nt.mak install
私の環境では実行に3分ほどかかりました。
途中でメモ帳が起動されるので、win32用と同様にnt.makを修正して上書きします。
ms¥do_win64aはバッチファイルなので、上記のコマンドプロンプトの内容をバッチファイルでまとめて実行するにはms¥do_win64aはcall文で呼び出します。
普通に呼び出すとms¥do_win64aを実行が終了する呼び出し元のバッチファイルに戻らないのでとnmakeが実行されません。
win64用のヘッダーファイルおよびDLL版やデバック版のライブラリを作成する場合
上記の着色部を以下のように変えるとDLL版やデバック版を作成することができます。
作成するライブラリ
Release DLL VC-WIN64A ntdll.mak
Release スタティック VC-WIN64A nt.mak
Debug DLL debug-VC-WIN64A ntdll.mak
Debug スタティック debug-VC-WIN64A nt.mak
nt.mak及びntdll.makはwin32と同様に修正してください。

バッチファイルを使用

win32向け
手入力版をバッチファイル化したものです。
win32のデバック版・リリース版合わせて以下の2種類のバッチファイルを作成しました。
各バッチファイルはDLL版・スタティック版のライブラリを作成します。
32release.bat
32debug.bat
opensslを解凍したフォルダーに上記のバッチファイルをコピーします。
Visual Studio用のヘッダーファイルおよびライブラリファイルを作成する場合は、 スタートメニューからVisual Studioのコマンド プロンプトを実行します。
他のバージョン用のヘッダーファイルおよびライブラリファイルを作成する場合は、該当するVisual Studioのコマンドプロンプトを選択します。
32bitと64bitは同じコマンドプロンプトでは実行できないので注意が必要です。
カレントフォルダーをopensslを解凍したフォルダーに移動させ、32release.bat又は32debug.batを実行します。
数分後に以下のフォルダー構成で必要なヘッダーファイルおよびライブラリファイルが作成されます。
libフォルダーにはDLL版のライブラリ、staticlibにはスタティック版のライブラリが格納しています。
ファイル名にdがついているライブラリはデバック版です。
    ├─openssl-1.0.2a
    │  ├─32release.bat
    │  └─32debug.bat
    └─x86
        ├─bin
        │  └─release
        │      libeay32.dll
        │      openssl.exe
        │      ssleay32.dll
        │  └─debug
        │      libeay32.dll
        │      openssl.exe
        │      ssleay32.dll
        ├─include
        │  └─openssl
        ├─lib
        │      libeay32.lib
        │      libeay32d.lib
        │      ssleay32.lib
        │      ssleay32d.lib
        └─staticlib
                libeay32.lib
                libeay32d.lib
                ssleay32.lib
                ssleay32d.lib
バッチファイルソースの概要
各バッチファイルのうち32ビットリリース版のバッチファイルのソースを参考として記載しました。
各バッチファイルは、ページの最後でダウンロードできます。
環境変数で出力フォルダーと一時ファイルのフォルダーを指定します。
cmd /cでperl及びclを実行して1以上の値が返ってきた場合は、perl.exe又はコンパイラがインストールされていないものとして終了します。
namke -f ファイル名 clear により前回のnmakeで作成されたファイルをクリアします。
perl Configure によりmakeファイルを作成します。
その後callによりdo_ms.bat又はdo_win64a.batを実行します。
perlによりコンパイラー及びリンカのオプションを修正します。
nmake を実行しDLL版を作成します。
xcopyにより一時フォルダーから出力フォルダーへファイルをコピーします。
namke -f ファイル名 clear により前回のnmakeで作成されたファイルをクリアします。
nmake を実行しスタティック版を作成します。
copyにより一時フォルダーからstaticlibフォルダ等にライブラリファイルをコピーします。 最後に一時フォルダーを削除します。
デバック版の場合、ライブラリファイルの名称の最後に文字dを付加します。
バッチファイルソースコード(win32 リリース版)
set OUT_DIR=..¥x86
set TEMP_DIR=..¥32temp


cmd /c perl -v >nul
if errorlevel 1 goto  err_perl
cmd /c cl >nul
if errorlevel 1 goto  err_cl
goto next1

:err_perl
echo Perlを実行することができません。
goto end

:err_cl
echo コンパイラを起動することができません。
echo Visual Studio の コマンド プロンプトから起動されていないかVisual Studioがインストールされていません。
goto end


:next1

echo start 32release %time% >> log.log

md %TEMP_DIR%
md %OUT_DIR%
md %OUT_DIR%¥bin¥release
md %OUT_DIR%¥lib
md %OUT_DIR%¥staticlib

nmake -f ms¥nt.mak vclean
nmake -f ms¥ntdll.mak vclean

perl Configure VC-WIN32 no-asm --prefix=%TEMP_DIR%
call ms¥do_ms

perl -l -p -e "s/^APP_CFLAG= ¥/Zi/APP_CFLAG= /g;" ms¥nt.mak > ms¥nt.1
perl -l -p -e "s/^LIB_CFLAG=¥/Zl ¥/Zi/LIB_CFLAG=¥/Zl/g;" ms¥nt.1 > ms¥nt.2
perl -l -p -e "s/^LIB_CFLAG= ¥/Zi ¥/Zi/LIB_CFLAG= /g;" ms¥nt.2 > ms¥nt.mak

perl -l -p -e "s/^APP_CFLAG= ¥/Zi/APP_CFLAG= /g;" ms¥ntdll.mak > ms¥nt.1
perl -l -p -e "s/^LIB_CFLAG=¥/Zl ¥/Zi/LIB_CFLAG=¥/Zl/g;" ms¥nt.1 > ms¥nt.2
perl -l -p -e "s/^LIB_CFLAG= ¥/Zi ¥/Zi/LIB_CFLAG= /g;" ms¥nt.2 > ms¥ntdll.mak

rem pause nt.mak ntdll.mak の作成が完了しました。フラグを修正する場合は修正上書き後、進めてください。

nmake -f ms¥ntdll.mak

nmake -f ms¥ntdll.mak test
if errorlevel 1 goto c_err

nmake -f ms¥ntdll.mak install

xcopy %TEMP_DIR% %OUT_DIR% /s /d /y
md %OUT_DIR%¥bin¥release
copy %OUT_DIR%¥bin¥*.* %OUT_DIR%¥bin¥release

del %OUT_DIR%¥bin¥ /q

echo DLL版の作成が終了しました %time% >> log.log

nmake -f ms¥ntdll.mak vclean

nmake -f ms¥nt.mak

nmake -f ms¥nt.mak test
if errorlevel 1 goto c_err

nmake -f ms¥nt.mak install
copy %TEMP_DIR%¥lib¥libeay32.lib %OUT_DIR%¥staticlib¥libeay32.lib
copy %TEMP_DIR%¥lib¥ssleay32.lib %OUT_DIR%¥staticlib¥ssleay32.lib

echo スタティック版の作成が終了しました %time% >> log.log

goto end

:c_err
echo コンパイル中にエラーが発生しました %time% >> log.log

:end
del /q /s %TEMP_DIR%
rd /q /s %TEMP_DIR%
echo end 32release %time% >> log.log


Win64向け
手入力版をバッチファイル化したものです。
in64のデバック版・リリース版合わせて以下の2種類のバッチファイルを作成しました。
各バッチファイルはDLL版・スタティック版のライブラリを作成します。
64release.bat
64debug.bat
opensslを解凍したフォルダーに上記のバッチファイルをコピーします。
Visual Studio用のヘッダーファイルおよびライブラリファイルを作成する場合は、 スタートメニューからVisual Studioのx64用のコマンド プロンプトを実行します。
他のバージョン用のヘッダーファイルおよびライブラリファイルを作成する場合は、該当するVisual Studioのコマンドプロンプトを選択します。
32bitと64bitは同じコマンドプロンプトでは実行できないので注意が必要です。
カレントフォルダーをopensslを解凍したフォルダーに移動させ、64release.bat又は64debug.batを実行します。
数分後に以下のフォルダー構成で必要なヘッダーファイルおよびライブラリファイルが作成されます。
libフォルダーにはDLL版のライブラリ、staticlibにはスタティック版のライブラリが格納しています。
ファイル名にdがついているライブラリはデバック版です。
    ├─openssl-1.0.2a
    │  ├─64release.bat
    │  └─64debug.bat
    └─x64
        ├─bin
        │  └─release
        │      libeay32.dll
        │      openssl.exe
        │      ssleay32.dll
        │  └─debug
        │      libeay32.dll
        │      openssl.exe
        │      ssleay32.dll
        ├─include
        │  └─openssl
        ├─lib
        │      libeay32.lib
        │      libeay32d.lib
        │      ssleay32.lib
        │      ssleay32d.lib
        └─staticlib
                libeay32.lib
                libeay32d.lib
                ssleay32.lib
                ssleay32d.lib
バッチファイルのダウンロード
バッチファイルのダウンロード

一括インストール

スタートメニューからVisual C++のコマンドプロンプトを抽出し指定したコマンドを実行するを使用して 複数のVisual C++のバージョンやWIN64・WIN32、リリース・デバック版を一括作成する方法を記載する。
実行にあたりVisual C++及びperlがあらかじめインストールされている必要がある。
openssl及び下に示すバッチファイルのリンクと上に示すリンクより実行ファイルをダウンロードし、解凍後以下の構成で保存する。
バッチファイルのダウンロード(makessl.zip)
フォルダー構成
    ├─openssl-1.0.2a
    │  ├─vc_get_cmd.exe
    │  └─makessl.bat
get_vc_cmd.exeを実行する。

上図のダイアログボックスが表示されるので、OpenSSLライブラリを作成するVisual C++のコマンドプロンプトにチェックを入れる。
構成は作成するリリース版及びデバック版に応じてチェックを入れる。
実行するコマンドには上図の用に入力する。
作業フォルダーは空白のままとする。
実行をクリックすると以下の構成でライブラリが作成される。(かなり時間がかかるので注意すること)
上図の環境では以下のフォルダー構成で作成される。
Visual C++のバージョンはVC9などという内部バージョンを示す文字列で区分される。
フォルダー構成
    ├─openssl-1.0.2a
    │  ├─vc_get_cmd.exe
    │  └─makessl.bat
    └─VC9
        └─x86
             ├─bin
             │  └─release
             │  └─debug
             ├─include
             │  └─openssl
             ├─lib
             └─staticlib

上図の環境で使用できるVisual C++ コマンドプロンプトに下5個のチェックを入れれば、1時間ほどで、以下の用に作成できた。x86及びx64以降のサブフォルダーは省略している。
    ├─openssl-1.0.2a
    │  ├─vc_get_cmd.exe
    │  └─makessl.bat
    ├─VC9
    │   ├─x86
    │   └─x64
    ├─VC10
    │   └─x86
    └─VC12
         ├─x86
         └─x64
makessl.bat バッチファイルの内容
前項のバッチファイルを使用では4個のバッチファイルを使用していたが、これを1個にまとめている。
コンパイル環境は引数で指定する。
rem OpenSSLライブラリをVisual C++で作成するバッチファイル

if "%1"=="x86" goto plat_chk_good
if "%1"=="x64" goto plat_chk_good 
goto help_msg

:plat_chk_good
if not "%2"=="" goto ver_chk_good
goto help_msg

:ver_chk_good
if "%3"=="debug" goto sln_chk_good
if "%3"=="release" goto sln_chk_good

:help_msg
echo 使用方法
echo makessl プラットフォーム VisualC++内部バージョン
echo プラットフォーム x86 or x64
echo VisualC++内部バージョン 9 or 10 or 11 or 12
echo デバック/リリース  debug or release
goto err_exit

:sln_chk_good
md ..¥VC%2
md ..¥VC%2¥%1
set OUT_DIR=..¥VC%2¥%1
set TEMP_DIR=..¥VC%2temp%1

cmd /c perl -v >nul
if errorlevel 1 goto  err_perl
cmd /c cl >nul
if errorlevel 1 goto  err_cl
goto next1

:err_perl
echo Perlを実行することができません。
goto end

:err_cl
echo コンパイラを起動することができません。
echo Visual Studio の コマンド プロンプトから起動されていないかVisual Studioがインストールされていません。
goto end

:next1

echo start VC%2%1%3 %time% >> log.log

if "%1"=="x86" set perl_opt=VC-WIN32
if "%1"=="x64" set perl_opt=VC-WIN64A
if "%3"=="debug" set perl_opt=debug-%perl_opt%
set file_opt=
if "%3"=="debug" set file_opt="d"


md %TEMP_DIR%
md %OUT_DIR%
md %OUT_DIR%¥bin
if "%3"=="debug" md %OUT_DIR%¥bin¥debug
if "%3"=="release" md %OUT_DIR%¥bin¥release
md %OUT_DIR%¥lib
md %OUT_DIR%¥staticlib

nmake -f ms¥nt.mak vclean
nmake -f ms¥ntdll.mak vclean

perl Configure %perl_opt% no-asm --prefix=%TEMP_DIR%

if "%1"=="x86" call ms¥do_ms
if "%1"=="x64" call ms¥do_win64a

if "%3"=="release" goto release_nt_edit
perl -l -p -e "s/¥/debug$//g;" ms¥ntdll.mak > ms¥nt.1
copy ms¥nt.1 ms¥ntdll.mak 
perl -l -p -e "s/¥/debug$//g;" ms¥nt.mak > ms¥nt.1
copy ms¥nt.1 ms¥nt.mak 
goto exit_nt_edit
:release_nt_edit
perl -l -p -e "s/^APP_CFLAG= ¥/Zi/APP_CFLAG= /g;" ms¥nt.mak > ms¥nt.1
perl -l -p -e "s/^LIB_CFLAG=¥/Zl ¥/Zi/LIB_CFLAG=¥/Zl/g;" ms¥nt.1 > ms¥nt.2
perl -l -p -e "s/^LIB_CFLAG= ¥/Zi ¥/Zi/LIB_CFLAG= /g;" ms¥nt.2 > ms¥nt.mak

perl -l -p -e "s/^APP_CFLAG= ¥/Zi/APP_CFLAG= /g;" ms¥ntdll.mak > ms¥nt.1
perl -l -p -e "s/^LIB_CFLAG=¥/Zl ¥/Zi/LIB_CFLAG=¥/Zl/g;" ms¥nt.1 > ms¥nt.2
perl -l -p -e "s/^LIB_CFLAG= ¥/Zi ¥/Zi/LIB_CFLAG= /g;" ms¥nt.2 > ms¥ntdll.mak


:exit_nt_edit
copy ms¥nt.mak ..¥VC%2%1%3_nt.mak
copy ms¥ntdll.mak ..¥VC%2%1%3_ntdll.mak
if "%1"=="x86" copy ms¥do_ms.bat ..¥VC%2%1%3_do_ms.bat
if "%1"=="x64" copy ms¥do_win64a.bat ..¥VC%2%1%3_do_win64a.bat

rem pause nt.mak ntdll.mak の作成が完了しました。フラグを修正する場合は修正上書き後、進めてください。

nmake -f ms¥ntdll.mak
nmake -f ms¥ntdll.mak test
if errorlevel 1 goto c_err

nmake -f ms¥ntdll.mak install

xcopy %TEMP_DIR% %OUT_DIR% /s /d /t /y
xcopy %TEMP_DIR%¥include %OUT_DIR%¥include /s /d /y
copy %TEMP_DIR%¥lib¥libeay32.lib %OUT_DIR%¥lib¥libeay32%file_opt%.lib
copy %TEMP_DIR%¥lib¥ssleay32.lib %OUT_DIR%¥lib¥ssleay32%file_opt%.lib
if "%3"=="debug" copy %TEMP_DIR%¥bin¥*.* %OUT_DIR%¥bin¥debug
if "%3"=="release" copy %TEMP_DIR%¥bin¥*.* %OUT_DIR%¥bin¥release
del %TEMP_DIR%¥bin¥ /q

echo DLL版の作成が終了しました %time% >> log.log

nmake -f ms¥ntdll.mak vclean

nmake -f ms¥nt.mak

nmake -f ms¥nt.mak test
if errorlevel 1 goto c_err

nmake -f ms¥nt.mak install

copy %TEMP_DIR%¥lib¥libeay32.lib %OUT_DIR%¥staticlib¥libeay32%file_opt%.lib
copy %TEMP_DIR%¥lib¥ssleay32.lib %OUT_DIR%¥staticlib¥ssleay32%file_opt%.lib

echo スタティック版の作成が終了しました %time% >> log.log

goto end

:c_err
echo コンパイル中にエラーが発生しました %time% >> log.log

:end

del /q /s %TEMP_DIR%
rd /q /s  %TEMP_DIR%
echo end VC%2%1%3 %time% >> log.log

:err_exit