编译静态库的方式使用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-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
首发于:http://lrzll.com/tech/cpp/fmtspdlog/