【MSYS/GCC】conanでパッケージを管理する

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【MSYS/GCC】conanでパッケージを管理する

2025-1-14 | , ,

MSYSのGCCでconanを使ってパッケージ(ライブラリー)を管理したい!

概要

今回の記事では、MSYSのGCCでconanを使ってパッケージ(ライブラリ)を管理する手順を掲載する。

Visual Studioで使えるパッケージマネージャーvcpkgを使う手順は、下記の記事に掲載してます。

仕様書

環境

  • gcc: 9.2.0
  • Python: 3.11.5
  • pip: 24.3.1
  • Conan: 2.11.0

手順書

「環境構築編」と「プロジェクト設定編」の2部構成です。

環境構築編

この記事ではMSYS2のGCCを使うので、先にMSYS2をインストールしておく。インストールの手順については下記の記事に掲載してます。

CRT環境のGCCMAKEを使うので、MSYS2環境でインストールする。

pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-make

conanのインストールにpipが必要で、pipを使うのにPythonが必要になる。PythonをWindowsにインストールに方法はいろいろあるんだけども、私は下記の記事のようにpuenvを使ってる。

pipを使ってグローバルにconanをインストールする。

pip install conan

インストールされるとコマンドconanが使えるようになる。インストールされたバージョンを確認してみる。

conan --version

cmakeも使うので公式サイトからインストーラーをダウンロードしてインストールする。

conanを使うにはprofileが必要になる。このprofileを切り替えて、GCCを使ったり、Visual Studioを使ったりする。

UCRT64環境のGCC用のprofileを作る。

conan profile detect --name=ucrt64_gcc

このプロファイルはユーザーディレクトリーの.conan2の中に生成される。

C:\Users\<username>\.conan2\ucrt64_gcc

私の環境ではデフォルトの設定としてVisual Studioのコンパイラーを使うようになってたので、これをUCRT64環境のGCCを使うよう修正する。

[settings]
os=Windows
compiler=gcc
compiler.version=14
compiler.libcxx=libstdc++11
compiler.threads=posix
compiler.exception=sjlj
arch=x86_64
build_type=Release

[buildenv]
PATH+=(path)C:/msys64/mingw64/bin
CXX=C:/msys64/mingw64/bin/g++

プロジェクト設定編

公式のサイトにあるチュートリアルのサンプルのプロジェクトのコードを参考して必要なファイルを作成してきます。

プロジェクトの構成は下記のような感じ。

.
├── CMakeLists.txt
├── conanfile.txt
└── src
    └── main.c

main.cの中身はこんな感じ。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <zlib.h>

int main(void) {
    char buffer_in [256] = {"Conan is a MIT-licensed, Open Source package manager for C and C++ development "
                            "for C and C++ development, allowing development teams to easily and efficiently "
                            "manage their packages and dependencies across platforms and build systems."};
    char buffer_out [256] = {0};

    z_stream defstream;
    defstream.zalloc = Z_NULL;
    defstream.zfree = Z_NULL;
    defstream.opaque = Z_NULL;
    defstream.avail_in = (uInt) strlen(buffer_in);
    defstream.next_in = (Bytef *) buffer_in;
    defstream.avail_out = (uInt) sizeof(buffer_out);
    defstream.next_out = (Bytef *) buffer_out;

    deflateInit(&defstream, Z_BEST_COMPRESSION);
    deflate(&defstream, Z_FINISH);
    deflateEnd(&defstream);

    printf("Uncompressed size is: %lu\n", strlen(buffer_in));
    printf("Compressed size is: %lu\n", strlen(buffer_out));

    printf("ZLIB VERSION: %s\n", zlibVersion());

    return EXIT_SUCCESS;
}

CMakeLists.txtの中身はこんな感じ。

cmake_minimum_required(VERSION 3.15)
project(compressor C)

find_package(ZLIB REQUIRED)

add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)

conanfile.txtの中身はこんな感じ。

[requires]
zlib/1.2.11

[generators]
CMakeDeps
CMakeToolchain

conanfile.txtにプロジェクトの依存関係を保管するのだと思われ。このプロジェクトはzlibのバージョン1.2.11に依存してる。

依存してるライブラリーをインストールするためのファイルを生成する。conanのpofileを指定する。

conan install . --profile=ucrt64_gcc --output-folder=build --build=missing

ディレクトリーbuildが生成され、その中にビルドに必要なファイルが生成される。

cmakeを使ってプロジェクトをビルドする。

cd build
cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake"
cmake --build . --config Release

ビルドが成功するとbuild/compressor.exeが生成される。

compressor.exeを実行してみる。

compressor.exe

下記にような感じで出力されればOKだ!

Uncompressed size is: 233
Compressed size is: 147
ZLIB VERSION: 1.2.11

まとめ(感想文)

cmakeの学習が必要そうだと思った今日この頃。