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
-
Githubからcloneする。
-
クローンディレクトリの"bootstrap-vcpkg.bat"を実行する。
→ "vcpkg.exe"が生成される。 -
(visual studioに統合する場合)そこのフォルダで管理者権限で cmd を実行して以下のコマンドを入力。
.\vcpkg.exe integrate install
これはユーザーごとに行う。
ライブラリのインストール
利用する前に、必要なライブラリをインストールする必要があります。
-
vcpkg search [名前] で利用可能なパッケージやその名前を持った利用可能ライブラリが列挙される
-
依存は移動で解決してくれる。
-
x64のみ、他のパッケージが必要といったライブラリもある。
- ceres は x64のみ
- vtkをインストールすると、msmpiが無いとエラーになる。
zlibの64bit-dll をインストールするとき
.\vcpkg install zlib:x64-windows
libpng の 32bit,staticライブラリ をインストールするとき
→ zlib は自動で依存解決してくれる。
.\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)
込み入った使い方
このプロジェクトでは、特定のバージョンのライブラリを使う必要があるとき
ライブラリの "profile.cmake"を書き換えればできるらしい。
- 専用にvcpkgをクローンする。
- ライブラリの profile.cmake のバージョンを書き換える。
- このプロジェクト用に integrate する。
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 パッケージの作り方