WindowsでのSSLサポートを使用したlibcurlの構築
質問
Win32 C ++アプリケーションでlibcurlを使用しています。
ソリューションにcurllib.vcprojプロジェクトを追加し、他のプロジェクトをそれに依存するように設定しています。
SSLサポートを有効にしてビルドするにはどうすればよいですか
解決
まあ、この投稿はひどく失敗したので、自分で問題を掘り下げなければなりませんでした。
他のバージョンなどに関する追加情報については、他の回答やコメントもご覧ください。
編集:このQを投稿してから、カールのホームページから利用可能な既製のバイナリがあるようです。 ジェームズの回答をご覧ください。
だからここに行きます:
-
プリプロセッサ
libcurlのSSLを有効にするには、次の2つのシンボルをプリプロセッサに供給する必要があります。
USE_SSLEAY
USE_OPENSSL
(libcurlはSSLサポートにOpenSSLを使用)
別の方法として、libcurlのsetup.hというファイルにシンボルを直接追加することもできますが、本当に必要な場合を除き、サードパーティディストリビューションのコードを変更することについてあまり満足していません。
libcurlライブラリを再構築すると、OpenSSLのインクルードファイルが見つからないというエラーが発生しました。当然、OpenSSLディストリビューションをまだ適切にセットアップしていないためです。
OpenSSLバイナリのコンパイル
OpenSSL 0.9.8ソースディストリビューションをダウンロードして解凍しました。
ソース配布物のルートには、INSTALL.W32というファイルがあり、OpenSSLバイナリをコンパイルする方法が記述されています。ビルドチェーンにはperlが必要なため、ActivePerlの最新バージョンをインストールしました。
ビルドに問題があり、すべてのシステムに適用できるわけではありませんが、誰かが同じことを経験した場合に備えて、ここで説明します。
INSTALL.W32によると:
現在のディレクトリをソース配布ルートに設定して、次のコマンドラインタスクを実行します。
1> perl Configure VC-WIN32 --prefix=c:/some/openssl/dir
(" c:/ some / openssl / dir"は、OpenSSLをインストールするディレクトリに置き換える必要があります。このパスにスペースを使用しないでください。その場合、先のコンパイルは失敗します)
2> ms\do_ms
私にとっては、環境変数OSVERSIONとTARGETCPUがなかったため、このステップは最初は失敗しました。これらをそれぞれ 5.1.2600 および x86 に設定します。 OSVERSIONが「非常識」であるという苦情を受け取るかもしれませんが、よく見ると、このエラーはWinCE用であり、Win32のセットアップには影響しません。 OSバージョンを把握するには、コマンドプロンプトから「ver」コマンドを実行するか、winver.exeを実行します。
3> nmake -f ms\nt.mak (for static library)
または
3> nmake -f ms\ntdll.mak (for DLL)
ソースがコンパイルされます。ラップトップで約5分かかりました。
コンパイルが完了すると、ライブラリまたはバイナリが次の場所に配置されました。
distroot / out32 -静的ライブラリのビルド用
または
distroot / out32dll -DLLビルド用
ビルドとリンク
ここで、Visual Studioに戻ってライブラリを指定し、ヘッダーのパスを含めます。インクルードファイルは distroot / inc32 / openssl にあります。
リンカー入力として libeay32.lib および ssleay32.lib を追加することを忘れないでください。
libcurlプロジェクトを再構築します。
エラー!
少なくとも、このバージョンのOpenSSLについては。 OpenSSLヘッダーの1つのstruct typedefについて不平を言いました。これに関する情報が見つかりませんでした。 1時間のグーグル検索の後、私は独自の原則を破り、OpenSSLヘッダーからtypedefをコメントアウトしました。
更新:Jasonが指摘したように、この問題はバージョン1.0.0aで消滅しているようです。
今、libcurlでSSLサポートが有効になっていることを確認するには、次のコードを実行します。
curl_version_info_data * vinfo = curl_version_info( CURLVERSION_NOW );
if( vinfo->features & CURL_VERSION_SSL )
// SSL support enabled
else
// No SSL
そのように単純。
他のヒント
おそらくこれは誰も探している答えではないかもしれませんが、私は単にこのリンクは http://curl.haxx.se/download.html
sharkinが提供するテストを実行し、 if(vinfo-> features& CURL_VERSION_SSL)
が正しいことが証明されました。
ロバート・オシュラーのアドバイスに続いて、回答としての質問に対する私のコメントを以下に示します。
プリプロセッサシンボルOpenSSLの代わりにUSE_WINDOWS_SSPIおよびUSE_SCHANNELを使用して、WindowsのネイティブSSLサポートを使用して、最近のlibcurl(2012)を構築できます。
Visual Studio 2010を使用してWindowsでOpenSSL 1.0.0をコンパイルすると、最終的に0x2エラーがスローされました:
NMAKE:致命的なエラーU1077: '" C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ BIN \ cl.EXE" ' :戻りコード「0x2」
停止
perl Configureファイルのフラグ、つまり-WXにより、このエラーがスローされるようです。 MSDNのドキュメントにあるように:
すべてのコンパイラ警告をエラーとして扱います。新しいプロジェクトでは、すべてのコンパイルで/ WXを使用するのが最善の場合があります。すべての警告を解決することで、見つけにくいコードの欠陥を最小限に抑えることができます。
Configureファイル内の-WXオカレンスを削除し、記載されているコマンドを再入力した後こちらは問題なく構築され、すべてのテストに合格しました。
私の場合、curlのREADMEファイルで十分でした。
私の構成は次のとおりです。
- Visual Studio 2015(VC14)
- 静的ライブラリ
- Win64
- curlバージョン7.57.0
- OpenSSL 1.0.2
libCurlのコンパイル
- そこにlibcurlソースをダウンロードします: https://curl.haxx.se/download.html
- ファイルを解凍し、フォルダー
curl-7.57.0 \ projects
に移動します
- READMEファイルを開いて指示に従います。これにより、次のことができます。
- ダウンロード OpenSSL
- それを抽出して
openssl
に名前を変更し、 curlフォルダーに保存します。これは、opensslが見つかると予想されるVSプロジェクトを開くために重要です。 - Perl をインストールします
- ユーティリティ
build-openssl.bat
を実行して、openSSLのコンパイルを実行します。私の設定では、これは次のようになりました。
。\ build-openssl.bat vc14 x64 release .. \ .. \ openssl \
。\ build-openssl.bat -help
を実行するだけで、パラメーターの詳細を確認できます。
その後、ここで新しいフォルダーを取得すると、OpenSSLがコンパイルされていることがわかります。openssl \ build \ Win64
- Visual Studioプロジェクトを開きます
curl-7.57.0 \ projects \ Windows \ VC14 \ curl-all.sln
- Visual Studioプロジェクトを必要なビルド構成に設定してください(
LIBリリース-私の場合はLIB OpenSSL
) - すべてをビルド
- ライブラリは
curl-7.57.0 \ build \ Win64 \ VC14 \ LIB Release-LIB OpenSSL \ libcurl.lib
にあります
備考
- 自分のプロジェクトで
CURL_STATICLIB
プリプロセッサを定義することを忘れないでください - 静的ライブラリでは、libcurlの依存関係とリンクする必要があります。この回答 を参照してください。
- LDAP に依存したくない場合は、libcurlをコンパイルする前に CURL_DISABLE_LDAP プリプロセッサを設定することで無効にできます。
Visual Studio IDEでビルドし、58のような奇妙な警告が表示された場合
" dllリンケージの不整合curl_global_init / curl_msnprintf /..."
CURL_STATICLIBをプリプロセッサ定義に追加する必要があります。
したがって、定義行全体は次のようになります。
USE_SSLEAY; USE_OPENSSL; CURL_STATICLIB。
これにより、すべての警告が消えます。
警告を無視してライブラリを使用し続けるものもありますが、curl_global_init / curl_msnprintfのような対応する* error *を取得します。非常に迷惑です。
誰かの助けになることを願っています。
\ fatal error C1083: Cannot open include
file: 'stdlib.h': No such file or directory
NMAKE: fatal error U1077::return code
このエラーは、Visual Studioでvcvarsall.batを実行することで解決できます。
iが" do_nt.bat"をしたWindows 7 rc7100用 " nmake -f ms \ nt.mak install"を忘れないでください。ヘッダーを正しくコピーする
これは大いに助けてくれてありがとう
上記に応じて、および/または上記に加えて、メモのカップル。
まず、ActivePerlを使いたくない場合は、 Strawberry Perl は素晴らしく、このために完璧に機能しました。
次に、 do_ms .batを使用する代わりに、可能であれば do_masm を使用することをお勧めします。INSTALL.W32によると、
これは行う価値があります コードの高速化:たとえば 通常は2回 RSAルーチンの高速化。
また、OpenSSLのビルド 0.9.8l (L)は悪夢だったので、最終的にあきらめて、(静的に)ビルドおよびリンクされた 0.9.8k に戻しましたlibcurl 1.9は問題なく。
WindowsでOpenSSL(SSLサポート)を使用してlibcurl C / C ++をビルドする方法
- libcurlのインストール
- OpenSSlのインストール
- OpenSSLでlibcurlを構築
libcurlのインストール
libcurlのダウンロードページに移動し、ソースの下でZIPファイルをダウンロードします。アーカイブ。 私の場合、 curl-7.58.0と呼ばれます。 zip
アーカイブを抽出し、Visual Studioで projects / Windows / VC15 / curl_all.sln
を開きます。
OpenSSLのインストール
OpenSSLのWindowsバイナリをダウンロードします。私の場合、Windowsインストーラーファイル Win32 OpenSSL v1.1.0g
の Shining Light Productionsディストリビューション。
私のインストールフォルダは C:\ OpenSSL-Win32
です。
OpenSSLを使用したlibcurlの構築
curl_all.sln
Visual Studioソリューションファイルで、ビルド構成を DLLデバッグ-DLL OpenSSL
に変更します。
ソリューションエクスプローラーで、プロジェクト curl
を右クリックし、[プロパティ]に移動します。
リンカーの下->一般
追加のライブラリディレクトリ
を変更し、 OpenSSLディレクトリ+ \ lib
へのパスを追加します。私の場合、これは C:\ OpenSSL-Win32 \ lib
です。
プロパティウィンドウを適用して閉じます。
プロジェクト libcurl
を右クリックして前の手順と同じ操作を行い、 OpenSSLディレクトリ+ \ lib
を Additional Library Directories
の<コード>リンカー-&gt;一般。
C / C ++の下-&gt;一般
、 C:\ OpenSSL-Win32 \ include
を Additional Include Directories
に追加します。
最後に Linkerに移動-&gt;入力
して、追加の依存関係
を変更します。すべてのlibファイルを次のものに置き換えます。
ws2_32.lib
wldap32.lib
openssl.lib
libssl.lib
libcrypto.lib
プロパティウィンドウを適用して閉じます。
DLLデバッグ-DLL OpenSSL
ビルド構成を選択したまま、 Build-&gt;に移動します。ソリューションのビルド
。
2つのdllファイル libcrypto-1_1.dll
および libssl-1_1.dll
をOpenSSL binディレクトリ( C:\ OpenSSL- Win32 \ bin
)を作成したビルドディレクトリ curl-7.58.0 \ build \ Win32 \ VC15 \ DLL Debug-DLL OpenSSL
に追加します。
ビルドの検証
ビルドディレクトリ内で、 curld.exe
を実行します。エラーなしで実行された場合(dllが見つからないなど)、ビルドは成功しました。