編譯靜態庫的方式使用spdlog和fmt

懶人在流浪發表於2021-11-10

前言

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-debugbuild-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


首發於:http://lrzll.com/tech/cpp/fmtspdlog/

相關文章