0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【備忘録】Windows環境において、vcpkg(クラシックモード)とCMakeを用いてライブラリを管理する

Last updated at Posted at 2025-03-30

vcpkgとCMakeを用いてライブラリを管理する方法について述べる。
私は普段VSCodeとGCCのコンパイラを用いてプログラミングを行っている。その環境でvcpkgを用いてライブラリ管理を行う際の方法について記す。

クラシックモードについてのざっくり理解

クラシックモードとは、VCPKG_ROOTフォルダの子フォルダにライブラリをインストールして用いる方法である。
VCPKG_ROOT/(triplet名)/includelibなどといったフォルダがあり、そこにライブラリが保存されることになる。

丸投げ

大体は上の記事の通りだ。私が書いているこの記事は、上のリンクの記事と並行して読むことを前提としているし、やり方の8割は上の記事に書いてある。ただ、上の記事はマニュフェストモードでの動作であり、後述の通り少しやり方が違う部分がある。ハマったポイントもあったので、忘れないうちにメモしておきたい。

記事との差異

先ほどリンクを貼った記事と、どういう点でやり方が違うのか書いておく。

マニフェストファイルを作らなくてよい

先ほどの記事では、「3 - 依存関係とプロジェクトファイルを追加する」の「1.」でマニフェストファイルを作成している。しかし、クラシックモードではマニフェストモードとは異なり、マニフェストファイルを作る必要がない。
なので、「マニフェスト ファイルを作成し、 fmt 依存関係を追加します。」のところは飛ばしてよい。

自分でライブラリをインストールしなくてはならない

クラシックモードでは、あらかじめvcpkgを用いてライブラリをインストールしておく必要がある。パッケージのインストールの際には正しいTripletを指定する必要がある。マイクロソフトのページによれば、Tripletとは以下のようなものだ。

tripletは、ターゲットのビルド環境 (cpu、os、コンパイラ、ランタイムなど) を 1 つの便利な名前でキャプチャします。 vcpkg は既定で 70 を超えるトリプレットを提供しますが、独自のトリプレットを定義することもできます。

自分の環境の場合は、コマンドラインに以下のように入力すればよかった。

vcpkg install fmt:x64-mingw-dynamic

ここでは、x64-mingw-dynamicがTripletだ。正しいTripletを指定しないと、様々な問題が発生することになる。開発環境によって指定すべきTripletは異なるので、各自で調べてみてほしい。ちなみに、私の環境では、windowsのPCでmingwのg++コンパイラを用いて開発を行っている。

ハマったポイント:CMakePresetsにおけるTripletの指定漏れ

マニュフェストモード、クラシックモード双方に言えることだが、コンパイルの際に自分の環境に対応した適切なTripletが指定されていないと、以下のようなエラーが出る。
Tripletはライブラリのインストールだけでなく、コンパイル時にも必要になるのだ。

undefined reference to \`__imp__ZN3fmt3v116vprintENS0_17basic_string_viewIcEENS0_17basic_format_argsINS0_7contextEEE'

これを解決するのには、以下の内容が役に立った。

【結論】

この記事の内容を踏まえて、実行する環境に合わせてCMakePresets.jsonを以下のように変更した。

{
  "version": 2,
  "configurePresets": [
    {
      "name": "vcpkg",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build",
      "cacheVariables": {
        "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
        "VCPKG_TARGET_TRIPLET": "x64-mingw-dynamic"
      }
    }
  ]
}

先述の通り、環境によって指定すべきTripletは異なるので、注意してほしい。

【別解】VSCodeの設定から変更する方法

vsCodeの設定から,以下の部分を変更することでも目的を達成できた.入力する項目は上に記したものと同じである.
image.png

【コラム的なもの】結局のところ、これは何を設定しているのか

CMakeは、コマンドラインから呼び出されることが多いが、今回はCMakePresets.jsonなどという得体のしれないファイルを設定し、VSCodeに任せて実行した。では、ここで行ったような内容の操作をコマンドライン上で行うには、どのようにすればよいのだろうか。

答えは以下のようなものになる。(多分。違ったらすみません)

cmake . -G"Ninja" -DCMAKE_TOOLCHAIN_FILE %VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake -VCPKG_TARGET_TRIPLET x64-mingw-dynamic

結局のところ、特別なことは何もしておらず、CMakePreset.jsonを使ってCMakeの引数を指定しているにすぎないのだ。

私が遭遇したエラー

Tripletを適切に設定しなかった際に、以下のようなエラーが出た。これは、rtmidiというライブラリを使おうとした際に起きたものである。

CMake Error at C:/vcpkg/scripts/buildsystems/vcpkg.cmake:893 (_find_package):
  Could not find a package configuration file provided by "rtmidi" with any of the following names:

    rtmidiConfig.cmake
    rtmidi-config.cmake

  Add the installation prefix of "rtmidi" to CMAKE_PREFIX_PATH or set "rtmidi_DIR" to a directory containing one of the above files.  If "rtmidi" provides a separate development package or SDK, be sure it has been installed.

このような状況にはまってしまい、上記のような方法でTripletを指定することで解決を試みてもうまくいかない場合、buildディレクトリを削除してやり直すとうまくいくことがある。

追記: x64-mingw-dynamicに設定した状態でライブラリをダウンロード、ビルドできないというエラー

vcpkgでライブラリをインストールしようとしたときに、「failed with: BUILD_FAILED」のようなエラーが出てダウンロードできないといったことが発生した。調べてみると、以下のサイトで似た症状が報告されており、解決策も提示されていた。

どうやら古いAnacondaのアンインストールが上手くいっていなかったのが原因のようだ。
しかし、私はこの方法ではうまくいかなかった。
仕方がないのでWindowsを再インストールしたところ、うまくいった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?