コンテンツにスキップ

C++/パッケージマネージャ

出典: フリー教科書『ウィキブックス(Wikibooks)』
< C++

パッケージマネージャ[編集]

C/C++におけるパッケージマネージャの必要性[編集]

近年、C/C++プログラミングにおいても外部ライブラリの利用が一般化しています。高機能なライブラリを活用することで、開発の効率化やコードの信頼性向上が図れるためです。しかし、ライブラリの導入には複雑な依存関係の管理が伴います。適切に管理されない場合、ビルドエラーやバージョン不整合などの問題が発生する可能性があります。

また、ソフトウェア開発では環境の違いによるビルド結果の変化を防ぐ必要があります。同じソースコードでも、使用するライブラリのバージョンや設定が異なれば、動作が変わってしまう可能性があるのです。これを回避するには、ビルド環境の統一が不可欠です。

このような状況において、パッケージマネージャは効率的な依存関係の管理と、プロジェクトの可搬性と再現性を実現するための重要なツールとなります。パッケージマネージャを利用すれば、必要なライブラリをすばやく入手し、簡単にセットアップできます。さらに、プロジェクトで使用するライブラリのバージョンを明示的に記述できるため、異なる環境でも同じビルド結果が得られるようになります。

主要なC/C++向けパッケージマネージャ[編集]

C/C++向けの主要なパッケージマネージャとして、以下の2つが広く利用されています。

Vcpkg[編集]

Vcpkg は、C/C++向けのオープンソースのパッケージマネージャです。GitHubでホストされており、Windows、Linux、macOSといったさまざまなプラットフォームに対応しています。CMakeベースのビルドシステムを採用しており、ビルドツールに依存しない設計となっています。

Vcpkgのインストールは公式サイト( https://vcpkg.io/ )から入手できるバイナリか、GitHubのリポジトリ( https://github.com/microsoft/vcpkg )からのクローンによって行えます。Windows向けのバイナリ配布もあり、手軽に利用を始められます。

Vcpkgを使ってライブラリをインストールする場合、以下のようなコマンドを実行します。

vcpkg install [packagename]

この vcpkg install コマンドでパッケージをインストールすると、自動的にそのパッケージに必要な依存ライブラリも一緒にインストールされます。インストール先は vcpkg フォルダ内の installed ディレクトリになります。

インストール済みのパッケージとバージョンを確認するには、次のコマンドを使います。

vcpkg list

パッケージの情報を見るには、以下のように実行します。

vcpkg search [packagename]

Conan[編集]

Conan は、C/C++、PythonでのオープンソースおよびプロプライエタリなパッケージングのためのCross-platformで無料のパッケージマネージャです。Conanには独自のレシピ形式があり、ソースコードからバイナリパッケージをビルドし、パッケージホスティングサービスにアップロードできます。Python製のため、クロスプラットフォームに対応しています。

Conanのインストールはpipコマンドで行えます。

pip install conan

Conanでパッケージをインストールする場合、以下のようにします。

conan install [packagename/version@user/channel] --build=missing

packageのリビジョンを指定したり、ビルド設定をカスタマイズすることもできます。

conan install [packagename/version@user/channel] ...

インストールされたパッケージを確認するには以下のコマンドを使います。

conan info .

Conanにもパッケージの検索機能があり、フィルタリング指定が可能です。

conan search [packagename] --remote=all

このように、VcpkgとConanはパッケージのインストール、検索、管理を行うためのコマンドラインツールを備えています。次の節では、具体的な使用方法をご紹介します。

パッケージマネージャの基本的な使用方法[編集]

パッケージマネージャを使う上で最も基本的な操作は、パッケージのインストール、削除、更新、情報確認です。この節では、VcpkgとConanを例にそれぞれの方法を解説します。

パッケージのインストール[編集]

パッケージをインストールする際は、パッケージ名を指定してコマンドを実行します。

Vcpkgの場合
vcpkg install [packagename]
例えば、広く利用されているBoostライブラリをインストールするには以下のようにします。
vcpkg install boost:x64-windows
Conanの場合
  
conan install [packagename/version@user/channel] --build=missing
versionやuser/channelを省略することもできます。例えばOpenCVの最新版をインストールする場合は、以下のようになります。
conan install opencv/4.5.1@

パッケージの削除[編集]

不要になったパッケージは削除できます。

Vcpkg
vcpkg remove [packagename]
Conan
conan remove [packagename] --src --build --packages
--src、--build、--packagesオプションでソース、ビルド、バイナリパッケージを削除するかを細かく指定できます。

パッケージの更新[編集]

インストール済みのパッケージを最新版に更新することもできます。

Vcpkg
vcpkg upgrade --no-dry-run
Conan
conan install [packagename/version@user/channel] --update

パッケージ情報の確認[編集]

Vcpkgでインストール済みのパッケージ一覧を表示:

vcpkg list
パッケージの詳細情報を表示
vcpkg search [packagename]

Conanでインストール済みのパッケージ情報を表示:

conan info .
パッケージを検索
conan search [packagename] --remote=all

このようにパッケージマネージャのコマンドラインツールを使うことで、外部ライブラリの管理を容易に行えます

ビルドシステムとの連携[編集]

パッケージマネージャでインストールしたライブラリを実際のプロジェクトで活用するには、ビルドシステムと連携させる必要があります。ここではCMakeとの連携方法を中心に解説します。

CMakeでのVcpkgの利用[編集]

VcpkgはCMakeとの連携に最適化されています。CMakeプロジェクトのルートディレクトリに vcpkg.cmake ツールチェーンファイルを配置し、CMakeLists.txt で読み込むことで連携できます。

CMakeLists.txt の設定例:

# VcpkgのMSVCツールチェーンファイルのパスを設定
set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
    CACHE STRING "Vcpkg toolchain file")

# ビルドに必要なパッケージを指定
find_package(Boost REQUIRED)
find_package(OpenCV REQUIRED)

# ターゲットリンクライブラリを指定
target_link_libraries(myapp
    PRIVATE 
        Boost::boost
        ${OpenCV_LIBS}
)

VcpkgではCMakeのfind_packageコマンドで外部ライブラリを検出できます。ライブラリがインストールされていない場合は自動的にvcpkgコマンドでインストールを試みます。

CMakeでのConanの利用[編集]

ConanもCMakeと連携できますが、標準ツールチェーンファイルは用意されていません。代わりに conan.cmake という独自のモジュールを利用します。

conanfile.txt にプロジェクトの依存関係を記述し、

[requires]
boost/1.73.0
opencv/4.5.1

[generators]
cmake

conan install コマンドで外部ライブラリをインストールします。インストール時に conan.cmake がプロジェクトルートに生成されます。

CMakeLists.txtconan.cmake を読み込むことで連携できます。

include(${CMAKE_BINARY_DIR}/conan.cmake)

# パッケージのインクルードパスをプロジェクトに追加
include_directories(${CONAN_INCLUDE_DIRS})

# ターゲットリンクライブラリを指定
target_link_libraries(myapp 
    ${CONAN_LIBS}
)

このようにCMakeプロジェクトにパッケージマネージャの情報を付与することで、ビルド時に外部ライブラリを適切に読み込めるようになります。

外部ライブラリの管理[編集]

前節でCMakeとの連携を見たように、パッケージマネージャを使えばさまざまな外部ライブラリを簡単にインストールできます。ここでは、特にC/C++で広く利用される主要ライブラリのインストール例をご紹介します。

Boost[編集]

C++の汎用ライブラリであるBoostは、VcpkgやConanのパッケージとして提供されています。

Vcpkg
vcpkg install boost:x64-windows
Conan
conan install boost/1.73.0@

Boostは膨大なモジュールから構成されるため、必要なモジュールのみ部分的にインストールすることもできます。

OpenCV[編集]

コンピュータビジョンライブラリのOpenCVもインストール可能です。

Vcpkg
vcpkg install opencv4:x64-windows
Conan
  
conan install opencv/4.5.1@

Conanではコンパイル済みのOpenCV 4.5.1バイナリパッケージを提供しています。VcpkgもバイナリをPullできますが、ソースからビルドすることも可能です。

その他にも、数値計算ライブラリのEigen、自然言語処理ライブラリのOPENNLP、幾何ライブラリのCGALなど、さまざまな人気ライブラリがVcpkgやConanでインストールできます。

パッケージマネージャの高度な機能[編集]

ここまでは、パッケージマネージャの基本的な使い方を解説してきました。しかし、パッケージマネージャには高度な機能も備わっています。この節では、カスタムパッケージの作成、バージョン管理、マルチプラットフォーム対応など、上級者向けの機能について説明します。

カスタムパッケージの作成[編集]

パッケージマネージャに登録されていないライブラリを利用したい場合、自分でカスタムパッケージを作成する必要があります。

Vcpkgではパッケージ定義ファイル(CONTROL)とビルドスクリプト(portfile.cmake)を記述します。

# CONTROL ファイル
Source: mylib
Version: 1.0
Description: My custom library
# portfile.cmake
vcpkg_from_github(
    OUT_SOURCE_PATH SOURCE_PATH
    REPO mylib/mylib
    REF v1.0
)

vcpkg_configure_cmake(
    SOURCE_PATH ${SOURCE_PATH}
    PREFER_NINJA
)

vcpkg_install_cmake()
vcpkg_copy_pdbs()

Conanではレシピ(conanfile.py)を記述してパッケージを作成します。

from conans import ConanFile, CMake

class MylibConan(ConanFile):
    name = "mylib"
    version = "1.0"
    
    def source(self):
        self.run("git clone https://github.com/mylib/mylib.git")

    def build(self):
        cmake = CMake(self)
        cmake.configure()
        cmake.build()
        
    def package(self):
        self.copy("*.h", dst="include", src="mylib")
        self.copy("*.lib", dst="lib", keep_path=False)

これらのファイルを用意し、パッケージマネージャのコマンドを実行するとカスタムパッケージが作成できます。

バージョン管理とアップグレード[編集]

パッケージマネージャではライブラリのバージョン指定と、アップグレードの機能が提供されています。

Vcpkgではバージョンを指定してインストールできます。

vcpkg install boost:x64-windows@1.72.0

アップグレードはこのコマンドで実行します。

vcpkg upgrade --no-dry-run

Conanでもバージョン指定が可能です。

conan install boost/1.72.0@

アップグレードは --update オプションをつけてインストールします。

conan install boost/1.73.0@ --update

また、ConanではGitリポジトリから直接インストールすることもできます。このようにしてリポジトリの最新版を入手できます。

conan install boost/1.73.0@conan/stable --build=missing

マルチプラットフォーム対応[編集]

C/C++アプリケーションはさまざまなプラットフォームで動作する必要があります。パッケージマネージャではプラットフォームごとにビルドオプションを指定して、クロスプラットフォームなバイナリパッケージを作成できます。

Vcpkgでは -Target オプションでプラットフォームを指定します。

vcpkg install boost:x64-windows
vcpkg install boost:x64-linux 
vcpkg install boost:x64-osx

Conanでもプラットフォーム設定が可能です。conan install 時のプロファイルでオプションを設定します。

conan install boost/1.73.0@ -s build_type=Release -s compiler=gcc -s ...

生成されたパッケージは、あらかじめ設定したリモートサーバーにアップロードしておき、必要な時にダウンロードできます。

ベストプラクティス[編集]

パッケージマネージャを効果的に活用するためには、適切な運用方法を心がける必要があります。この節では、パッケージマネージャの利用におけるベストプラクティスをいくつか紹介します。

セキュリティ対策[編集]

第三者が提供するパッケージを利用する際は、セキュリティリスクに注意を払う必要があります。パッケージにマルウェアが含まれていたり、既知の脆弱性が存在する可能性があるためです。

そこで、公的な信頼できるリポジトリからパッケージを取得することが推奨されます。Vcpkgの公式リポジトリやConanのconan-centerリポジトリなどがそれにあたります。

Vcpkg
vcpkg install [package] --overlay-ports=https://github.com/microsoft/vcpkg
Conan
conan install [package] --remote=conan-center

信頼できないソースからパッケージを取得する場合は、ソースコードを確認し、脆弱性のスキャンを行うなどの対策が必要です。

キャッシュの活用[編集]

ネットワーク経由でパッケージをダウンロードしてくると、回線状況によっては時間がかかる可能性があります。特に大規模なプロジェクトでは、この影響が無視できません。

そこでパッケージマネージャではキャッシュ機能が用意されています。一度ダウンロードしたパッケージはキャッシュに保存されるので、2回目以降は高速にインストールできます。

Vcpkgのキャッシュは以下のディレクトリに保存されています。

%VCPKG_ROOT%\packages

Conanのキャッシュは、デフォルトで以下の場所に置かれています。

~/.conan

このキャッシュディレクトリはリポジトリのように扱え、共有やバックアップも可能です。複数の開発者で同じキャッシュを参照すれば、無駄な通信トラフィックを大幅に削減できます。

CIでの利用[編集]

継続的インテグレーション(CI)ではビルド環境の完全な再現が重要です。そこでパッケージマネージャを導入することで、確実に同一の外部ライブラリをインストールでき、ビルド再現性が高まります。

CIサービスの多くは、パッケージマネージャをあらかじめサポートしています。例えばAppVeyorではVcpkgが利用でき、CircleCIではConanが利用可能です。

CIの設定ファイルに、パッケージマネージャのインストールと依存ライブラリのインストール手順を記述します。以下はVcpkgとCircleCIの例です。

# CircleCI の設定ファイル
jobs:
  build:
    docker: 
      - image: circleci/python:3.7
    steps:
      # VcpkgのセットアップとBoostライブラリのインストール
      - run:
          name: Install Vcpkg and Dependencies  
          command: |
            git clone https://github.com/Microsoft/vcpkg.git
            ./vcpkg/bootstrap-vcpkg.sh
            ./vcpkg/vcpkg install boost:x64-linux  
      # プロジェクトのビルド
      - checkout
      - run:
          command: |
            mkdir build
            cd build  
            cmake .. -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake
            make

このようにCIでパッケージマネージャを活用することで、本番環境でのビルド確認が確実になり、品質の向上が期待できます。

まとめ[編集]

この章では、C/C++開発におけるパッケージマネージャの必要性と、主要なパッケージマネージャであるVcpkgとConanの使い方を詳しく解説してきました。

パッケージマネージャを利用することで、次のようなメリットが得られます。

- 外部ライブラリの簡単なインストールと管理 - 依存関係の自動解決 - プロジェクトの可搬性と再現性の向上 - ビルド時間の短縮 - 開発の効率化

特にC/C++のようにコンパイル時間が長く、多くの外部ライブラリに依存するプロジェクトではパッケージマネージャの導入が不可欠といえます。

一方で、パッケージマネージャを安全かつ効率的に運用するために、セキュリティ対策やキャッシュの活用、CIでの利用などのベストプラクティスも押さえておく必要があります。

パッケージマネージャはC/C++の開発環境を大きく改善するツールです。本章で解説した内容を活かして、ぜひ実際の開発でパッケージマネージャを積極的に活用していただければと思います。

今後もパッケージマネージャはさらに進化を続けていくでしょう。新しい機能の追加や、より使いやすくなるための改善が行われていくことが予想されます。C/C++開発者としては、これらの動向に注目し、よりよいツールを取り入れていくことが重要になるでしょう。