前言
spdlog++庫,而且支援header only方式,但header only的使用方式會造成編譯時長增加,所以這裡簡單描述一下,其編譯靜態庫的方式。
又因為spdlog還依賴另一個開源庫fmt,而fmt
目前已經加入標準庫,所以很多時候,自己的專案會自帶fmt
,不需要spdlog內部繫結一個。所以本文會採用一下方式來組成編譯。
- sdplog # 使用外部fmt
- fmt # 獨立的
- 靜態庫
- 通過cmake方式組裝工程
例項工程專案目錄
deps
├── include
│ ├── fmt
│ └── spdlog
├── lib
│ ├── cmake # 包含一些 cmake包使用的指令碼 如 find_package()
│ ├── fmt.lib
│ ├── fmtd.lib
│ ├── libfmt.a
│ ├── libfmtd.a
│ ├── libspdlog.a
│ ├── libspdlogd.a
│ ├── pkgconfig # 包含一些 cmake包使用的指令碼 如 find_package()
│ ├── spdlog.lib
│ └── spdlogd.lib
├── lib64 # 有的linux(CentOS)下會區分lib64/lib,編譯64位上面的lib內容會放入lib64下
└── src
├── fmt # fmt原始碼 可直接通過git clone 獲取
└── spdlog
編譯
準備
- cmake 19.x 其他版本沒跑過
- fmt、spdlog最新的原始碼
有些命令可能在linux下略有不同
準備原始碼到deps/src/
下,如:
cd ./deps/src
git clone https://github.com/fmtlib/fmt.git
git clone https://github.com/gabime/spdlog.git
以下是在windows 10
,以預設的visual studio 2019
編譯,
不過為了方便理解,例項統一採用build-debug
和build-release
,分別建立資料夾構建編譯安裝。
cmake --install . --prefix ../../../ --config Debug
,如果在CMAKE_INSTALL_PREFIX值是有效的可以不用指定--prefix
cmake --install . --config Debug
注意
在通過cmake生成工程時,CMAKE_INSTALL_PREFIX
通過命令選項的方式指定值時最好加引號,否則某些相對路徑無法賦值進去。
本文只會使用平臺無關的cmake命令來構建編譯安裝。
需要先編譯fmt
,再編譯spdlog
。
fmt
- 8.0.1
編譯debug版本
cd ./deps/src/fmt
mkdir build-debug && cd build-debug
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DCMAKE_INSTALL_PREFIX="../../.." -DCMAKE_CXX_STANDARD=17 -DCMAKE_BUILD_TYPE=Debug ..
# 或
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DCMAKE_INSTALL_PREFIX="../../.." -DCMAKE_CXX_STANDARD=17 -DCMAKE_BUILD_TYPE=Debug .. -G"Visual Studio 16 2019" -Ax64
cmake --build . --target fmt --config Debug
# 使用CMAKE_INSTALL_PREFIX的安裝目錄
cmake --install . --config Debug
# 指定指定新的安裝目錄
cmake --install . --prefix ../../../ --config Debug
編譯release版本
cd ./deps/src/fmt
mkdir build-release && cd build-relase
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DCMAKE_INSTALL_PREFIX="../../.." -DCMAKE_CXX_STANDARD=17 -DCMAKE_BUILD_TYPE=Release .. -G"Visual Studio 16 2019" -Ax64
cmake --build . --target fmt --config Release
cmake --install . --config Release
spdlog
- 1.9.2
編譯debug版本
mkdir build-debug && cd build-debug
cmake -D SPDLOG_FMT_EXTERNAL=ON -DCMAKE_INSTALL_PREFIX="../../.." -DMAKE_CXX_STANDARD=17 -DSPDLOG_BUILD_EXAMPLE=OFF -DSPDLOG_FMT_EXTERNAL=ON -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --target spdlog --config Debug
cmake --install . --config Debug
release就不說了。
使用自編譯的fmt和spdlog
目錄結構
├── CMakeLists.txt
├── Log.cpp
├── Log.h
├── deps
│ ├── include
│ └── lib
├── hello.cpp
└── readme.md
使用find_package
find_package(fmt REQUIRED PATHS ./deps/ NO_DEFAULT_PATH)
find_package(spdlog REQUIRED PATHS ./deps/ NO_DEFAULT_PATH)
cmake會在./deps/lib/cmake
或./deps/lib64/cmake
,搜尋對應的cmake配置檔案(前面cmake --install
,會拷貝的)
直接使用
直接配置相應的標頭檔案目錄和庫目錄
target_include_directories(${PROJECT_NAME} PUBLIC ./deps/include)
target_link_directories(${PROJECT_NAME} PUBLIC ./deps/lib)
最後
完整例項
https://github.com/iclodq/fmtspdlog