web-dev-qa-db-ja.com

WindowsでのSSLサポートを使用したlibcurlの構築

Win32 C++アプリケーションでlibcurlを使用しています。

ソリューションにcurllib.vcprojプロジェクトを追加し、他のプロジェクトがそれに依存するように設定しています。

SSLサポートを有効にしてビルドするにはどうすればよいですか?

42
sharkin

まあ、この投稿はひどく失敗したので、自分で問題を掘り下げなければなりませんでした。

また、他のバージョンなどに関する追加情報については、他の回答とコメントも確認してください。

編集:この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-for DLL build

構築とリンク

ここで、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

そのような単純な。

48
sharkin

たぶんこれは誰も探している答えではないかもしれませんが、 this link から http://curl.haxx.se/download.html

Sharkinが提供するテストを実行し、if( vinfo->features & CURL_VERSION_SSL )が真であることが証明されました。

8
James

ロバート・オシュラーのアドバイスに従い、質問に対する回答としての私のコメントを以下に示します。

OpenSSLの代わりにUSE_WINDOWS_SSPIおよびUSE_SCHANNELのプリプロセッサシンボルを使用して、WindowsのネイティブSSLサポートを使用して、最近のlibcurl(2012)を構築できます。

6
fa.

WindowsでVisual Studio 2010を使用して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オカレンスを削除し、記載されているコマンドを再入力すると here 正常にビルドされ、すべてのテストに合格しました。

5
GaMer13

私の場合、curl READMEファイルで十分でした。
私の構成は次のとおりです。

  • Visual Studio 2015(VC14)
  • 静的ライブラリ
  • Win64
  • curlバージョン7.57.0
  • OpenSSL 1.0.2

LibCurlのコンパイル

  1. そこにlibcurlソースをダウンロードします: https://curl.haxx.se/download.html
  2. ファイルを解凍し、フォルダーcurl-7.57.0\projectsに移動します
  3. READMEファイルを開き、指示に従ってください。これにより、次のことを実行できます。
    • ダウンロード OpenSSL
    • 展開して名前をopensslに変更し、curlフォルダーを別に置いてください。これは、VSプロジェクトを開くときに重要です。そこにopensslが見つかると期待しています。
    • インストール Perl
    • ユーティリティbuild-openssl.batを実行して、openSSLのコンパイルを実行します。私の設定では、これは次のようになりました:
      .\build-openssl.bat vc14 x64 release ..\..\openssl\
      パラメータの詳細を知るために、.\build-openssl.bat -helpを実行するだけです。
      その後、次の新しいフォルダを取得するとOpenSSLがコンパイルされていることがわかります:openssl\build\Win64
  4. Visual Studioプロジェクトcurl-7.57.0\projects\Windows\VC14\curl-all.slnを開きます
  5. 必要なビルド構成にVisual Studioプロジェクトを設定してください(私の場合は[LIB Release - LIB OpenSSL
  6. すべてビルド
  7. ライブラリはcurl-7.57.0\build\Win64\VC14\LIB Release - LIB OpenSSL\libcurl.libにあります

備考

  • 自分のプロジェクトでCURL_STATICLIBプリプロセッサを定義することを忘れないでください
  • 静的ライブラリでは、libcurlの依存関係とリンクする必要があります。 this answer を参照してください。
  • [〜#〜] ldap [〜#〜]に依存したくない場合があります。その場合は、プリプロセッサCURL_DISABLE_LDAPbeforelibcurlをコンパイルします。
3
vtellier
\ fatal error C1083: Cannot open include
file: 'stdlib.h': No such file or directory
NMAKE: fatal error U1077::return code 

このエラーは、Visual Studioでvcvarsall.batを実行することで解決できます。

2
jayaanand

Visual Studio IDEでビルドし、58の奇妙な警告を受け取る場合

「一貫性のないDLLリンケージcurl_global_init/curl_msnprintf/...」

cURL_STATICLIBをプリプロセッサ定義に追加する必要があります。

したがって、定義行全体は次のようになります。

USE_SSLEAY; USE_OPENSSL; CURL_STATICLIB。

これにより、すべての警告が消えます。

警告を無視してライブラリを使用し続ける人もいますが、curl_global_init/curl_msnprintfのような対応する* error *を取得します。それは非常に迷惑です。

それが誰かを助けることを願っています。

2
Hackle

上記への応答および/または追加の注記。

最初に、ActivePerlをいじりたくない場合は、 Strawberry Perl が素晴らしいです。

第二に、do_ms。batを使用する代わりに、do_masm可能な場合、INSTALL.W32によると、

これは、コードの高速化につながるため、実行する価値があります。たとえば、通常、RSAルーチンの速度は2倍になります。

また、OpenSSLのビルド0.9.8l(L)は悪夢だったため、最終的にあきらめて0.9.8kに戻しましたlibcurl 1.9で問題なく構築およびリンク(静的に)。

1
hemp

WindowsでOpenSSL(SSLサポート)を使用してlibcurl C/C++をビルドする方法

  1. Libcurlをインストールする
  2. OpenSSlをインストールする
  3. OpenSSLでlibcurlをビルドする

Libcurlのインストール

libcurlのダウンロードページ に移動し、Source Archivesの下にZipファイルをダウンロードします。 私の場合は curl-7.58.0.Zipと呼ばれます

アーカイブを抽出し、Visual Studioでprojects/Windows/VC15/curl_all.slnを開きます。

OpenSSLのインストール

OpenSSLのWindowsバイナリをダウンロードします。私の場合、Windowsインストーラーファイル Win32 OpenSSL v1.1.0gShining Light Productionsディストリビューション からダウンロードしました。

私のインストールフォルダはC:\OpenSSL-Win32です。

OpenSSLを使用したlibcurlの構築

curl_all.sln Visual Studioソリューションファイルで、ビルド構成をDLL Debug - DLL OpenSSLに変更します。

ソリューションエクスプローラーで、プロジェクトcurlを右クリックし、[プロパティ]に移動します。

Linker -> GeneralAdditional Library Directoriesを変更し、OpenSSL directory + \libへのパスを追加します。私の場合、これはC:\OpenSSL-Win32\libです。

プロパティウィンドウを適用して閉じます。

プロジェクトlibcurlを右クリックし、前のステップと同じように、OpenSSL directory + \libの下のAdditional Library DirectoriesLinker -> Generalを追加します。

C/C++ -> Generalの下で、C:\OpenSSL-Win32\includeAdditional Include Directoriesに追加します。

最後に、Linker -> Inputに移動して、Additional Dependenciesを変更します。すべてのlibファイルを次のものに置き換えます。

ws2_32.lib
wldap32.lib
openssl.lib
libssl.lib
libcrypto.lib

プロパティウィンドウを適用して閉じます。

DLL Debug - DLL OpenSSLビルド構成を選択したまま、Build -> Build Solutionに移動します。

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が見つからないなど)、ビルドは成功しました。

1
Acidic