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://cloudpack.media/45881
インストール
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
みたいなコマンドはないみたいです。
conanfile.txt
[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
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
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