山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他OpenSSL1.0.2aをVisual C++ 2008/2013で使用する
概要
OpenSLLはWindows/Linux/Macで使えるSSLをサポートしたライブラリである。
Visual C++で使用するにはソースからヘッダーファイルおよびソースをコンパイルしてライブラリファイルを作成する必要がある。
Visual C++でコンパイルおよび実行するために必要な作業について述べる。
また、複数のVisual C++のバージョンやWIN64・WIN32、リリース・デバック版を一括作成する方法を追記した。(2015/04/19)
Visual C++で使用するにはソースからヘッダーファイルおよびソースをコンパイルしてライブラリファイルを作成する必要がある。
Visual C++でコンパイルおよび実行するために必要な作業について述べる。
また、複数のVisual C++のバージョンやWIN64・WIN32、リリース・デバック版を一括作成する方法を追記した。(2015/04/19)
テスト環境
コンパイラ
Visual C++ 2008 Express Version 9.0.30729.1 SP 32bitVisual 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 64bitWindows 8.1 Enterprise 64bit
OpenSSLのヘッダーファイル・ライブラリファイル作成に必要なファイルのダウンロード・解凍
ヘッダーファイル・ライブラリファイルの作成にはPerlが必要です。
コンパイラのバージョンが異なる場合は、バージョンごとにライブラリファイルを作成する必要があります。
上記よりFree Downloadを選び Version 5.20.1.2000 Windows Installer (MSI)をダウンロードし実行します。
適当な解凍プログラム(Lhaplus Version 1.59(2010/10/14)or WinZIP 試用版など)を使用して解凍する。
Linuxが使える環境であれば、Linuxでダウンロードして解凍後にWindowsへコピーするのが簡単です。
コンパイラのバージョンが異なる場合は、バージョンごとにライブラリファイルを作成する必要があります。
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¥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 |
バッチファイルを使用
win32向け
手入力版をバッチファイル化したものです。win32のデバック版・リリース版合わせて以下の2種類のバッチファイルを作成しました。
各バッチファイルはDLL版・スタティック版のライブラリを作成します。
32release.bat 32debug.batopensslを解凍したフォルダーに上記のバッチファイルをコピーします。
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.batopensslを解凍したフォルダーに上記のバッチファイルをコピーします。
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.batget_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
Copyright (C) 2012 山本ワールド All Rights Reserved.