vcpkg

vcpkgを使ってみた

More than 1 year has passed since last update.

vcpkgというWindows 用のC++パッケージマネージャーが公開されてます。

Github

ドキュメント

それを使ったときのノートです。

ceresのインストールが圧倒的に簡単で感動したので。あとqiitaになかったので。

vcpkg機能の説明はここが網羅していました。

TechRacho 【速報】Vcpkg: Windowsの公式C++ライブラリ管理ツール


  • vs2017、vs2015 update3 以降
    (faqより)

    ⇔ vs2010/2012/2013 では"integrate install"のコマンドを実行しても、includeやlibの依存を解決してくれなかった。

  • (オプション) CMake 3.8


    MSBuild/CMakeが優先的に使われる。

    らしいけれども、CMakeインストール済み環境で試したので、どのように動作が切り替わるか、は不明。


  • nuget との関係

    visual studioで利用できるパッケージシステムに、nugetというのもある。

    どちらも、開発用のパッケージシステム。

    nuget は基本的にdotnet用。ビルド済みのバイナリを配布する用途

    vcpkg はvc専用のパッケージシステム。ソースコードを配布して、各所でビルドして使ってもらう。



使ってみる


vcpkg の install


  1. Githubからcloneする。


  2. クローンディレクトリの"bootstrap-vcpkg.bat"を実行する。

    → "vcpkg.exe"が生成される。


  3. (visual studioに統合する場合)そこのフォルダで管理者権限で cmd を実行して以下のコマンドを入力。

    cmd

    .\vcpkg.exe integrate install



    これはユーザーごとに行う。



ライブラリのインストール

利用する前に、必要なライブラリをインストールする必要があります。


  • vcpkg search [名前] で利用可能なパッケージやその名前を持った利用可能ライブラリが列挙される


  • 依存は移動で解決してくれる。



  • x64のみ、他のパッケージが必要といったライブラリもある。


    • ceres は x64のみ

    • vtkをインストールすると、msmpiが無いとエラーになる。



zlibの64bit-dll をインストールするとき

cmd

.\vcpkg install zlib:x64-windows



libpng の 32bit,staticライブラリ をインストールするとき


→ zlib は自動で依存解決してくれる。

cmd

.\vcpkg install libpng:x86-windows-static


ライブラリを使う


vcでintegrate install をしてあるとき

インストール済みのライブラリが自動で利用可能になる。

"#include " と書くと自動で解決、dllのコピーなどをやってくれる。

(既定の追加のインクルードディレクトリに、"$(VcpkgRoot)include\"というものが増えている。)

入り組んだインクルード関係の時

$(VcpkgRoot) という vcのマクロが今の環境で読み込んでいるフォルダへのパス

"C:\dev\sources\vcpkg\installed\x86-windows\" など

example:

'#include <pybind11\pybind11.h> としてインクルードする。内部で

'#include <python3.h> をインクルードしているので、ファイルが見つけられなくてエラーになる。

vcの追加のインクルードフォルダに $(VcpkgRoot)include\python3.6\; を書いておくと、ちゃんと見つけてもらえる。


CMake から使うとき

ここに書いてある。github Example: Using Sqlite#CMake (Toolchain file)


込み入った使い方


このプロジェクトでは、特定のバージョンのライブラリを使う必要があるとき

doc "プロジェクトごと"より

ライブラリの "profile.cmake"を書き換えればできるらしい。


  1. 専用にvcpkgをクローンする。

  2. ライブラリの profile.cmake のバージョンを書き換える。

  3. このプロジェクト用に integrate する。

    cmd
    vcpkg integrate project



自分の環境の vcpkg をほかの人に渡す

vcpkg export (ライブラリ) --zip

→ zipが作られる

--nuget オプションでnugetパッケージが作られる。


vcpkg integrate project すると何が起きたかのメモ

>> vcpkg integrate project

Created nupkg: d:\dev\vcpkg\scripts\buildsystems\vcpkg.d.dev.vcpkg.1.0.0.nupkg

With a project open, go to Tools->NuGet Package Manager->Package Manager Console and paste:
Install-Package vcpkg.d.dev.vcpkg.1.0.0.nupkg -Source "d:\dev\vcpkg\scripts\buildsystems"

書いてある通り、vs2017を起動して、「ツール」⇒「NuGetパッケージマネージャー」⇒「パッケージマネージャー コンソール」を起動。

ペーストしろと書いてあるコマンド

「Install-Package vcpkg.d.dev.vcpkg.1.0.0.nupkg -Source "d:\dev\vcpkg\scripts\buildsystems"」

を張り付けると、既定のプロジェクトに上記のnupkg参照が追加される。

。。。

じゃあそのnupkgは何者かと思ったので中身を調べると、[vcpkgのフォルダ]scripts\buildsystems\msbuild\vcpkg.targets を取り込むnupkg

そのvcpkg.targets ファイルの中身は、"vcpkg integrate project" を呼び出したvcpkgのinclude/libフォルダへの参照をプロジェクトファイルに追加しているだけ。

出力フォルダへDLLのコピーとか、libファイルのlinkなどの処理も入っていた。


todo

private パッケージの作り方