vcpkg

vcpkgを使ってみた

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 パッケージの作り方