C++開発環境兼conanの使い方

2022.11.09
はじめに
大学院の研究でC++を使うハメになったのですが, hello worldもできるか怪しい状態から一通り開発ができる状態になった???のでここに書き留めておきます。対象読者は
- conanをpackage managerとして使う人: 下の方まで飛ばしてください
- C++の開発を始める人: 真似してもいいよん
- 新しい言語を学ぶ人: こんな手順でやるひとがいるんだぁくらいに思ってください。
- それ以外の人: 好きなNetflix作品を私に教えて下さい。
一応雰囲気はかけるようになっておく
それっぽいサイトに目を通す
一週間で身につくC++をやりました。もちろんちゃんとはやっていないし、一応全部目を通した?けれど0,1日目だけやっておけば良さそう。
leetcodeをやる
いきなり環境設定をするのが面倒だったのでとりあえずleetcodeのeasyやmediumくらいを5, 6問やってみました。easyに普通に1時間くらいかかりました。ただvectorが使えるようになっただけの気がする。
formatterの設定
これがないとコードが書けないのでいつもはじめにやります
$ sudo apt install clang-format -y
ちなみに大学のサーバーではsudoが使えませんでした。ソースコードをbuildして自分のuser内だけで使うこともできそうなのですがその機能を有効にするのに特権モードが必要のようでした。なぜ手元でbuildすることも許可が必要なのかよく分かっていないのですが気になる人はUbuntu 20.04: apt sourceでソースコードをダウンロードするなどを参考にしてもらえればよいと思います。
vscodeの拡張機能vscode-clang-formatを入れて.vscode/settings.json(workspaceの設定)を
{
"clang-format.executable": <path-to-clang-format>
}
のようにします。ちなみにpathの部分は自分の場合は/usr/bin/clang-format
でした。
package manager CONANの設定
package管理として、先輩が研究で開発していたリポジトリはgit submoduleを使っていたのですが,自分の好みではなかったのでやめておきました。
選択肢としては3つほどありそうで,その中でもよく使われてそうなCONANというやつを導入してみました。
CLI11パッケージを入れるまで
とりあえずpackageを入れるところまでやってみます。
プロジェクトのrootにconanfile.txt
を作成し、中身を次のようにします。
[requires]
cli11/2.3.1
[generators]
cmake
modulesというディレクトリを作って,そこにインストールしていますがディレクトリ名は何でもいいです。
$ mkdir modules
$ conan install . --install-folder modules
CLI11を使うプログラムを作ります
$ mkdir src
$ cd src
$ touch main.cpp
とし、main.cppを次のようにします。
#include "CLI/CLI.hpp"
#include <iostream>
int main(int argc, char *argv[]) {
CLI::App app{"App description"};
// Define options
int p = 0;
app.add_option("-p", p, "Parameter");
CLI11_PARSE(app, argc, argv);
std::cout << "Parameter value: " << p << std::endl;
return 0;
}
プロジェクトのrootにCMakeListも書いておきます。
cmake_minimum_required(VERSION 2.8.12)
project(homfa-runner)
add_definitions("-std=c++14")
include(${CMAKE_BINARY_DIR}/modules/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(main src/main.cpp)
target_link_libraries(main ${CONAN_LIBS})
build & 実行
$ cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
$ cd bin
$ ./main