编译静态库的方式使用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 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/

上一篇:【iOS】编译静态库


下一篇:opencv编译静态库时选择MD模式无效的原因