ソフトウェア
Drogonセットアップ
仕訳帳ソフトを作ろうと思って、sqlite3にrestapiで保存するためdrogonの設定をしていました。
久々だったので、下記の記事を見て思い出しながら設定しました。
再ハマり防止の備忘録をメモしておきます。
要点は次の通りです。
- トップディレクトリDrogonフォルダを作成
- an-tao-drogon-v1.9.10.tar.gzをDrogon/drogon@repositoryに 解凍
- Drogon/drogon@repository/vcpkg.json を作成
- Drogon/drogon@repository/lib/src/DbClientManager.h を修正
- postgresを使う場合はFindpg.cmakeを修正
- drogon@repositoryをビルド&インストール
- Drogon/cmake/deps/Drogon.cmakeを作成
- drogon_ctl create project で Drogon/drogon@”project”を作成
- Drogon/drogon@”project”/CMakeLists.txtを修正
- Drogon/share/config/”project”にconfig.jsonを移動
- main.ccに../share/config/”project”/config.jsonをロード
トップディレクトリDrogonフォルダを作成
Drogonフォルダで作業します。CMakeLists.txtを作成してdrogon@”project”をサブモジュールとしてビルドする準備をします。複数のdrogonプロジェクトを作成する場合に、トップディレクトリに共通モジュールを作成して使います。
an-tao-drogon-v1.9.10.tar.gzをdrogon@repository 解凍
v1.9.10は中文.txtがあってcmakeで解凍ができなかったため、vcpkgで解凍前のファイルを直接解凍してビルドしました。
drogon@repositoryという名前で解凍します。
※現在(2025-12-27)vcpkgでそのままdrogonが使用できます。
drogon@repository/vcpkg.json を作成
パッケージのインストールをします。vcpkg.jsonを作成し、以下のパッケージをインストールします。
vcpkg.json
{
"dependencies": [
"brotli",
"c-ares",
"jsoncpp",
"openssl",
"trantor",
"zlib",
"libpq",
"sqlite3"
]
}Drogon/drogon@repository/lib/src/DbClientManager.h を修正
コントローラーでapp().getLoop()->queueInLoop(…)を実行してコールバックを登録する場合、main.ccでコンフィグファイルがロードされる前にDbClientManager.hの設定確認が行われます。これを防止する修正を入れます。
ただのmain.ccでコンフィグロードし忘れでした。
DbClientManager.h
DbClientPtr getDbClient(const std::string &name)
{
// ここから
if (dbClientsMap_.find(name) == dbClientsMap_.end())
{
LOG_INFO << "name not found";
for (auto [key, client] : dbClientsMap_)
LOG_INFO << key;
throw std::runtime_error("wait a moment until app().run() end processing");
}
// ここまで
// ⇩で止まります。
assert(dbClientsMap_.find(name) != dbClientsMap_.end());
return dbClientsMap_[name];
}postgresを使う場合はFindpg.cmakeを修正
vcpkgでインストールしたpostgresを使用するように修正します。
Findpg.cmake
find_package(PostgreSQL)
if(PostgreSQL_FOUND)
set(PG_LIBRARIES ${PostgreSQL_LIBRARIES})
set(PG_INCLUDE_DIRS ${PostgreSQL_INCLUDE_DIRS})
message(STATUS "pg inc: " ${PostgreSQL_INCLUDE_DIRS})
// 追加
add_library(pg_lib ALIAS PostgreSQL::PostgreSQL)
// コメントアウト
#[[add_library(pg_lib INTERFACE IMPORTED)
set_target_properties(pg_lib
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${PostgreSQL_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES
"${PostgreSQL_LIBRARIES}") ]]
mark_as_advanced(PG_INCLUDE_DIRS PG_LIBRARIES)drogon@repositoryをビルド&インストール
ビルドしてビルドフォルダにてninja installを実行します。out/install/binにdrogon_ctlが作成されます。out/install/cmake/DrogonフォルダにDrogonConfig.cmakeが作成されます。
Drogon/cmake/deps/Drogon.cmakeを作成
Drogon.cmakeを作成します。
Drogon.cmake
set(DROGON_REPOSITORY_DIR "${DROGON_PROJECT_DIR}/drogon@repository/out/install/[arch]")
include_directories(${DROGON_REPOSITORY_DIR}/include)
set(Trantor_DIR ${DROGON_REPOSITORY_DIR}/lib/cmake/Trantor)
find_package(Trantor CONFIG REQUIRED)
set(Drogon_DIR ${DROGON_REPOSITORY_DIR}/lib/cmake/Drogon)
find_package(Drogon CONFIG REQUIRED)drogon_ctl create project で Drogon/drogon@”project”を作成
今回は仕訳帳Liteというソフトを作りたいのでproject名をjournaliteとして作成します。
drogon_ctl create project drogon@journalite
Drogon/drogon@”project”/CMakeLists.txtを修正
CMakeLists.txtを修正します。
src/CMakeLists.txt
// 先ほどのDrogon.cmake置き場
list(APPEND CMAKE_MODULE_PATH ${DROGON_PROJECT_DIR}/cmake/deps)
// dorogon@~フォルダで使用するDrogonパッケージをインクルード
include(Drogon)drogon@”project”/CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
// プロジェクト名を変更
project(journalite CXX)
// コメントアウト
# find_package(Drogon CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon)Drogon/share/config/”project”にconfig.jsonを移動
Drogon/shasre/config/”project”にconfig.jsonを移動します。
DrogonフォルダでビルドするためDrogon/out/build/[arch]/shareにconfig.jsonが配備されるようにCMakeList.txtに設定します。
share/CmakeLists .txt
add_custom_target(_share
COMMAND ${CMAKE_COMMAND} -E copy_directory ${DROGON_PROJECT_DIR}/share/ ${CMAKE_BINARY_DIR}/share
)
ninja _shareコマンドで配備されるようになります。
main.ccに../share/config/”project”/config.jsonをロード
最後、一番忘れてハマるポイントがおそらくこれです。コンフィグロードし忘れてるから永遠に動かない😂
main.cc
drogon::app().loadConfigFile("../share/config/journalite/config.json");
コメントを残す