C++ を利用し始めたのですが、ライブラリを利用するのにpip
とかyarn
とかgem
みたいなライブラリ管理ツールを利用したくて、良いツールがないか探していたら、Conanというものがあったので、お試ししてみました。
C/C++ Open Source Package Manager
https://conan.io/
多くのプラットフォーム、ビルドシステムに対応していて使い勝手がよさそうです。
All platforms
Windows, Linux, Apple, FreeBSD, Android, iOS, embedded, cross-building, etc.
All build systems
Visual Studio MSBuild, CMake, Makefiles, SCons, etc. Extensible to any build system.
All packages
Python based package recipes for great extensibility, customization and integration with other systems. Package and reuse your build tools too.
下記でも紹介されており、興味をもちました。
Conan C/C++ Package Managerを使ってみた - Qiita
https://qiita.com/gasuketsu/items/6bea2465f0425c4cf5ab
利用するライブラリはConanのドキュメントでも利用されていたPOCOってのにしました。
POCO C++ Libraries - Simplify C++ Development
https://pocoproject.org/
環境・前提条件
> sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.6
BuildVersion: 17G4015
> g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
> gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
# CMakeを利用します
> cmake --version
cmake version 3.13.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
# Pythonとpipを利用します
> python --version
Python 3.6.6
> pip --version
pip 19.0.1 from (略)
CMakeってなにそれという方はこちらをご参考ください。
C++初心者がMacでCMakeを利用してみる - Qiita
https://qiita.com/kai_kou/items/df335eb7ee78229ee46f
インストール
pip
を利用してインストールします。仮想環境を作成していますが、お好みです。
conanのドキュメントをみると仮想環境下での利用が推奨されています。
また、Python 3.4の場合、落とし穴があるみたいなので、ご注意ください^^
Install — conan 1.12.0 documentation
https://docs.conan.io/en/latest/installation.html
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> python -m venv venv
> . venv/bin/activate
# fishな方用
> . venv/bin/activate.fish
> pip install conan
(略)
Successfully installed PyJWT-1.7.1 PyYAML-3.13 asn1crypto-0.24.0 astroid-2.1.0 bottle-0.12.16 certifi-2018.11.29 cffi-1.11.5 chardet-3.0.4 colorama-0.4.1 conan-1.12.0 cryptography-2.3.1 deprecation-2.0.6 distro-1.1.0 fasteners-0.14.1 future-0.16.0 idna-2.6 isort-4.3.4 lazy-object-proxy-1.3.1 mccabe-0.6.1 monotonic-1.5 node-semver-0.6.1 packaging-19.0 patch-1.16 pluginbase-0.7 pyOpenSSL-18.0.0 pycparser-2.19 pygments-2.3.1 pylint-2.2.2 pyparsing-2.3.1 requests-2.21.0 six-1.12.0 tqdm-4.30.0 typed-ast-1.3.0 urllib3-1.24.1 wrapt-1.11.1
> conan --version
WARN: Remotes registry file missing, creating default one in /Users/kai/.conan/registry.json
Conan version 1.12.0
設定
ドキュメントを参考にしつつPECOが利用できるようにします。
Getting Started — conan 1.12.0 documentation
https://docs.conan.io/en/latest/getting_started.html
conan search
コマンドでライブラリが存在するか確認します。
ドキュメントだと検索文字列をそのまま指定していましたが、Mac?Fish?の場合、ダブルクォーテーション"
で括る必要がありました。
> conan search "Poco*" --remote=conan-center
Existing package recipes:
Poco/1.7.8p3@pocoproject/stable
Poco/1.7.9@pocoproject/stable
Poco/1.7.9p1@pocoproject/stable
Poco/1.7.9p2@pocoproject/stable
Poco/1.8.0.1@pocoproject/stable
Poco/1.8.0@pocoproject/stable
Poco/1.8.1@pocoproject/stable
Poco/1.9.0@pocoproject/stable
conan inspect
コマンドでパッケージの情報が確認できます。
> conan inspect Poco/1.9.0@pocoproject/stable
Poco/1.9.0@pocoproject/stable: Not found in local cache, looking in remotes...
Poco/1.9.0@pocoproject/stable: Trying with 'conan-center'...
Downloading conanmanifest.txt
[==================================================] 186B/186B
Downloading conanfile.py
[==================================================] 8.4KB/8.4KB
name: Poco
version: 1.9.0
url: http://github.com/pocoproject/conan-poco
homepage: None
license: The Boost Software License 1.0
author: None
description: Modern, powerful open source C++ class libraries for building network- and internet-based applications that run on desktop, server, mobile and embedded systems.
topics: None
generators: ('cmake', 'txt')
exports: None
exports_sources: ('CMakeLists.txt', 'PocoMacros.cmake')
short_paths: False
apply_env: True
build_policy: None
settings: ('os', 'arch', 'compiler', 'build_type')
options:
cxx_14: [True, False]
(略)
ライブラリが利用できるようにconanの設定ファイルconanfile.txt
を作成します。
> touch conanfile.txt
[requires]
で利用するライブラリ、[generators]
に利用するビルドシステムを指定するみたいです。
パッケージ管理ツールによくあるconan add xxx
みたいなコマンドはないみたいです。
[requires]
Poco/1.9.0@pocoproject/stable
[generators]
cmake
conanfile.txt
には[options]
でリンクを動的・静的にするかなど指定ができるみたいです。
Installing dependencies — conan 1.12.0 documentation
https://docs.conan.io/en/latest/using_packages/conanfile_txt.html
リンクについてはまだよく把握していませんが下記が詳しかったです。
ライブラリのリンク方法をきっちり区別しよう - Qiita
https://qiita.com/argama147/items/2f636a2f4fd76f6ce130
ライブラリをインストールする
まだ実装がありませんが、先にライブラリをインストールしてみます。
> mkdir build
> cd build
> conan install ..
Configuration:
[settings]
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=apple-clang
compiler.libcxx=libc++
compiler.version=10.0
os=Macos
os_build=Macos
[options]
[build_requires]
[env]
(略)
ERROR: Missing prebuilt package for 'Poco/1.9.0@pocoproject/stable'
Try to build it from sources with "--build Poco"
Or read "http://docs.conan.io/en/latest/faq/troubleshooting.html#error-missing-prebuilt-package"
エラーになりました。読めと出てきたドキュメントをみると、conanはデフォルトではソースからパッケージをビルドしないみたいので、ビルド済みのファイルがない場合は、パラメータでビルドするように指定する必要があるそうです。なので、--build Poco
を追加して再実行してみます。
Troubleshooting — conan 1.12.0 documentation
https://docs.conan.io/en/latest/faq/troubleshooting.html#error-missing-prebuilt-package
> conan install .. --build Poco
conanfile.txt: Installing package
Requirements
OpenSSL/1.0.2o@conan/stable from 'conan-center' - Cache
Poco/1.9.0@pocoproject/stable from 'conan-center' - Cache
zlib/1.2.11@conan/stable from 'conan-center' - Cache
Packages
OpenSSL/1.0.2o@conan/stable:75c89fa3e1091e5c3911f9847d6d4abd7c60e60f - Cache
Poco/1.9.0@pocoproject/stable:abee8e51298879d92da94c759061385c809e5325 - Build
zlib/1.2.11@conan/stable:534dcc368c999e07e81f146b3466b8f656ef1f55 - Cache
zlib/1.2.11@conan/stable: Already installed!
OpenSSL/1.0.2o@conan/stable: Already installed!
(略)
[100%] Built target Zip
Poco/1.9.0@pocoproject/stable: Package 'abee8e51298879d92da94c759061385c809e5325' built
Poco/1.9.0@pocoproject/stable: Build folder /Users/kai/.conan/data/Poco/1.9.0/pocoproject/stable/build/abee8e51298879d92da94c759061385c809e5325
Poco/1.9.0@pocoproject/stable: Generated conaninfo.txt
Poco/1.9.0@pocoproject/stable: Generated conanbuildinfo.txt
Poco/1.9.0@pocoproject/stable: Generating the package
Poco/1.9.0@pocoproject/stable: Package folder /Users/kai/.conan/data/Poco/1.9.0/pocoproject/stable/package/abee8e51298879d92da94c759061385c809e5325
Poco/1.9.0@pocoproject/stable: Calling package()
Poco/1.9.0@pocoproject/stable package(): Copied 1 file: LICENSE
Poco/1.9.0@pocoproject/stable package(): Copied 761 '.h' files:
Poco/1.9.0@pocoproject/stable package(): Copied 13 '.a' files:
Poco/1.9.0@pocoproject/stable: Package 'abee8e51298879d92da94c759061385c809e5325' created
conanfile.txt: Generator cmake created conanbuildinfo.cmake
conanfile.txt: Generator txt created conanbuildinfo.txt
conanfile.txt: Generated conaninfo.txt
conanfile.txt: Generated graphinfo
今度はエラーなく完了しました。いくつかのファイルがbuild
ディレクトリに生成されたのと、ライブラリは/Users/xxx/.conan/data/
配下に配置されました。POCOライブラリが依存しているライブラリも同時にインストールされています。これは便利だ!
> tree .
.
├── conanbuildinfo.cmake
├── conanbuildinfo.txt
├── conaninfo.txt
└── graph_info.json
> ls /Users/xxx/.conan/data/
OpenSSL Poco zlib
実装してビルド
POCOライブラリを利用した実装をしてみます。以下のサンプルを利用させてもらいました。
POCO C++ Libraries の簡単な使用方法 - Qoosky
https://www.qoosky.io/techs/8e92d3d34a
> touch ../poco_sample.cpp
#include <iostream>
#include <Poco/RegularExpression.h>
int main() {
Poco::RegularExpression regexp("^[a-zA-Z]+");
std::string buf;
regexp.extract("ABC123", buf);
std::cout << buf << std::endl;
return 0;
}
ビルド出来るようにCMakeLists.txt
を作成します。
conan install
で生成されたbuild/conanbuildinfo.cmake
を含めるのがポイントでしょうか。
> touch ../CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
project(ConanSample)
add_definitions("-std=c++11")
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(poco_sample poco_sample.cpp)
target_link_libraries(poco_sample ${CONAN_LIBS})
cmake
コマンドを実行してみます。
> cmake ..
-- The C compiler identification is AppleClang 10.0.0.10001044
-- The CXX compiler identification is AppleClang 10.0.0.10001044
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc -- works
(略)
-- Configuring done
-- Generating done
-- Build files have been written to: 任意のディレクトリ/build
> cmake --build .
Scanning dependencies of target poco_sample
[ 50%] Building CXX object CMakeFiles/poco_sample.dir/poco_sample.cpp.o
[100%] Linking CXX executable bin/poco_sample
[100%] Built target poco_sample
> tree -L 2 .
.
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.13.3
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── Makefile.cmake
│ ├── Makefile2
│ ├── TargetDirectories.txt
│ ├── cmake.check_cache
│ ├── feature_tests.bin
│ ├── feature_tests.c
│ ├── feature_tests.cxx
│ ├── poco_sample.dir
│ └── progress.marks
├── Makefile
├── bin
│ └── poco_sample
├── cmake_install.cmake
├── conanbuildinfo.cmake
├── conanbuildinfo.txt
├── conaninfo.txt
└── graph_info.json
bin/poco_sample
が生成されましたので、実行してみます。
> ./bin/poco_sample
ABC
動きました!!!
まとめ
ライブラリの依存関係を解決してくれるので、利用するまでの手間をだいぶと省くことができそうです。
ほかにもライブラリ管理ツールはあるので、そのうちに試してみたいと思います。
参考
C/C++ Open Source Package Manager
https://conan.io/
Conan C/C++ Package Managerを使ってみた - Qiita
https://qiita.com/gasuketsu/items/6bea2465f0425c4cf5ab
POCO C++ Libraries - Simplify C++ Development
https://pocoproject.org/
Install — conan 1.12.0 documentation
https://docs.conan.io/en/latest/installation.html
Getting Started — conan 1.12.0 documentation
https://docs.conan.io/en/latest/getting_started.html
Installing dependencies — conan 1.12.0 documentation
https://docs.conan.io/en/latest/using_packages/conanfile_txt.html
ライブラリのリンク方法をきっちり区別しよう - Qiita
https://qiita.com/argama147/items/2f636a2f4fd76f6ce130
Troubleshooting — conan 1.12.0 documentation
https://docs.conan.io/en/latest/faq/troubleshooting.html#error-missing-prebuilt-package
POCO C++ Libraries の簡単な使用方法 - Qoosky
https://www.qoosky.io/techs/8e92d3d34a