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

前言

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 //github.com/fmtlib/fmt.git
git clone //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)

最後

完整實例
//github.com/iclodq/fmtspdlog


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

Tags: