none
VS2017のパッケージマネージャーでインストールしたライブラリ利用時のビルドエラー RRS feed

  • 質問

  • こんにちは。初めての質問になります。

    やりたいこと

    Visual Studio 2017 開発している C++のプログラムで、curlppというライブラリが必要となり、

    VS2017に備わっているパッケージマネージャーでインストール可能という情報を見つけて、

    Install-Package curlpp

    を実行し、ソリューションエクスプローラーに packages.config というファイルができました。

    確認すると、

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="curl" version="7.30.0.2" targetFramework="native" />
      <package id="curl.redist" version="7.30.0.2" targetFramework="native" />
      <package id="curlpp" version="0.7.3.1" targetFramework="native" />
      <package id="curlpp.redist" version="0.7.3.1" targetFramework="native" />
      <package id="libssh2" version="1.4.3.1" targetFramework="native" />
      <package id="libssh2.redist" version="1.4.3.1" targetFramework="native" />
      <package id="openssl" version="1.0.1.21" targetFramework="native" />
      <package id="openssl.redist" version="1.0.1.21" targetFramework="native" />
      <package id="zlib" version="1.2.8.1" targetFramework="native" />
      <package id="zlib.redist" version="1.2.8.1" targetFramework="native" />
    </packages>

    とあり、依存関係含めてプロジェクトに入ったような風です。

    しかし、次のインクルード文を入れてビルドすると、

    #include <curlpp/Easy.hpp>

    次のような警告とエラーが出ます。(類似したものが多いので、簡略化しています。パスは省略しています。

    \packages\curlpp.0.7.3.1\build\native\include\curlpp\exception.hpp(49): warning C4275: DLL インターフェイスではない class 'std::runtime_error' が DLL インターフェイスのベースになる class 'curlpp::RuntimeError' として使われています。
    
    省略
    
    \packages\curlpp.0.7.3.1\build\native\include\curlpp\internal\curlhandle.hpp(183): warning C4251: 'curlpp::internal::CurlHandle::mWriteFunctor': class 'utilspp::Functor<size_t,utilspp::tl::TypeList<char *,utilspp::tl::TypeList<size_t,utilspp::tl::TypeList<size_t,utilspp::NullType>>>>' は __export キーワードを使って class 'curlpp::internal::CurlHandle' にエクスポートしてください。
    
    省略
    
    \packages\curlpp.0.7.3.1\build\native\include\curlpp\option.inl(45): error C2491: 'curlpp::Option<OT>::Option': dllimport 関数 の定義は許されません。
    メッセージで検索しても、問題がいまいちピンと来ません。

    私はどのようにすればよろしいでしょうか?

    ご教示お願いいたします。

    2019年6月27日 9:08

回答

  • curlppパッケージですが、確認してみたところ、Visual C++ 2010およびVisual C++ 2012でビルドしたバイナリしか含まれていませんでした。ですので、たとえ質問のエラーが解消したとしてもVisual C++ 2017での使用は困難です。

    Visual C++では現在NuGetパッケージは使用されておらず、vcpkgという新しいパッケージマネージャーに移行しています。こちらはいわゆるソースパッケージで、利用者が自身でビルドを行う設計のため、コンパイラーバージョンが合わないといった問題は発生しません。cURLppももちろん用意されています。

    REM 以下は一度のみ実行
    
    git clone https://github.com/Microsoft/vcpkg.git
    cd vcpkg
    .\bootstrap-vcpkg.bat
    .\vcpkg integrate install
    
    REM cURLppインストール
    
    git pull
    .\bootstrap-vcpkg.bat
    .\vcpkg install curlpp

    なお、デフォルトの構成では、libssh2、opensslは組み込まれませんでした。この辺り、質問者さんがどのような目的でcURLppを使用されるのかにもよりますので、不足がありましたら返信ください。MicrosoftとしてはcURLppと類似したライブラリとしてC++ REST SDKを提供していますので、こちらも参考になるかもです。

    # Visual C++に限定した話題なのでそちらのフォーラムのほうが適切かと。
    • 編集済み 佐祐理 2019年6月27日 23:35
    • 回答としてマーク suneo3476 2019年7月1日 1:36
    2019年6月27日 23:33

すべての返信

  • curlppパッケージですが、確認してみたところ、Visual C++ 2010およびVisual C++ 2012でビルドしたバイナリしか含まれていませんでした。ですので、たとえ質問のエラーが解消したとしてもVisual C++ 2017での使用は困難です。

    Visual C++では現在NuGetパッケージは使用されておらず、vcpkgという新しいパッケージマネージャーに移行しています。こちらはいわゆるソースパッケージで、利用者が自身でビルドを行う設計のため、コンパイラーバージョンが合わないといった問題は発生しません。cURLppももちろん用意されています。

    REM 以下は一度のみ実行
    
    git clone https://github.com/Microsoft/vcpkg.git
    cd vcpkg
    .\bootstrap-vcpkg.bat
    .\vcpkg integrate install
    
    REM cURLppインストール
    
    git pull
    .\bootstrap-vcpkg.bat
    .\vcpkg install curlpp

    なお、デフォルトの構成では、libssh2、opensslは組み込まれませんでした。この辺り、質問者さんがどのような目的でcURLppを使用されるのかにもよりますので、不足がありましたら返信ください。MicrosoftとしてはcURLppと類似したライブラリとしてC++ REST SDKを提供していますので、こちらも参考になるかもです。

    # Visual C++に限定した話題なのでそちらのフォーラムのほうが適切かと。
    • 編集済み 佐祐理 2019年6月27日 23:35
    • 回答としてマーク suneo3476 2019年7月1日 1:36
    2019年6月27日 23:33
  • 佐祐理さま

    ご回答ありがとうございます。

    ・ Visual C++ 2017 環境での curlpp の使用は困難と考えられること

    ・ パッケージ管理には vcpkg が利便性が高いこと

    以上理解いたしました。大変参考になりました。

    今回は curlppの使用を諦め、代替となるライブラリを探すつもりです。

    以下返信します。

     >質問者さんがどのような目的でcURLppを使用されるのかにもよります

    HTTPS通信で WebAPIを叩く用途で使用するつもりです。ですから、opensslは必要ですね。

    実は最初 C++ REST SDKを利用していたのですが、ターミナルから curlコマンドを叩くのと同様のリクエストを C++ REST SDKで投げても 500エラーが返ってくるようになってしまいました。代替としてlibcurlのラッパーライブラリを使ってみると上手くいくのではないか……という期待をして今回は curlpp を選択しました。せっかくご指南頂いたところ、すみません。

    私は Visual C++での開発がメインで、また今後フォーラムを利用させて頂く機会があるかもしれません。投稿先のフォーラムに注意するようにいたします。

    2019年6月28日 5:12
  • HTTPS通信ができればよくてopensslが必要なわけではありませんよね? vcpkgで用意されているcurlppはWindowsに付属する暗号化を使用しているため、opensslが不要になるだけです。

    C++ REST SDKで500エラーになった点については調査・原因究明した方が良いと思われます。

    2019年6月28日 5:41
  • >vcpkgで用意されているcurlppはWindowsに付属する暗号化を使用しているため、opensslが不要になる

    こちらの勉強不足でした。詳しくありがとうございます。

    >C++ REST SDKで500エラーになった点

    こちらは自分で詳しく調べてみることにします。


    2019年6月28日 6:41