编译静态库的方式使用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/
编译静态库的方式使用spdlog和fmt的更多相关文章
- 【iOS】编译静态库
与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...
- Xcode 编译静态库
有时候,我们需要将一部分经常用到的代码提取出来用来复用,或者说需要用到c++的代码的时候,可以通过编译成静态库的方式来使用.本文中使用的Xcode版本是8.3,静态库制作过程和其他版本基本一样,可能出 ...
- 关于使用Visual编译静态库动态库及其使用的问题
本文主要讲述了如何使用Visual Studio 2013 编译静态库和动态库,并使用. 一.静态库 1. 编写静态库 若要创建将引用并使用刚创建的静态库的应用程序,请从“文件”菜单中选择“新建”, ...
- android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)
android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在an ...
- 【转】TI DSP C6657学习之——编译静态库.lib
熟悉C++开发的的小伙伴都知道,我们一般代码中往往要引入许多第三方编译好的库,有些是静态链接库static library, 有些是动态链接库dll.引入库的目的一是减少代码的编译时间,二是只提供函数 ...
- Makefile 编译静态库文件及链接静态库
本文为原创文章,转载需指明该文链接 1.代码目录结构如下: comm/ comm/inc/apue.h 3 atexit.c Makefile 5 staticlib/lib/ staticlib ...
- opencv编译静态库时选择MD模式无效的原因
在Cmake-gui上看到的明明是MD运行库依赖,生成MS项目时却变成了MT运行库依赖. 原因在于编译静态库时内部做了自动替换.
- Xcode 之自己编译静态库
今天介绍下,如何利用Xcode,新建一个静态库,以及如何编译成i386.armv7.armv7s 等平台架构. 开发环境:MAC OS X 10.9.4 + Xcode 5.0.2 背景知识:库分两种 ...
- windows openssl-1.1.1 编译静态库和动态库
一下为windows上安装过程 1.下载 openssl-1.1.0.tar.gz 2.安装 ActivePerl, 可以到http://www.activestate.com/activeperl/ ...
随机推荐
- python二级 第9套
1. prInt.默认输出空格 2. 我的这种想法也行不通啊 format() 一次只能有一个未知量 2. 分割的结果就是列表 3. 对比"大学" 上一套的split('&q ...
- 关于open falcon 与nightingale 的一些调研
针对 open-falcon 与 nightingale 的调研 一.open-falcon 1.1 组件介绍 1.1.1 agent > agent用于采集机器负载监控指标,比如cpu.idl ...
- 常见的==和equals比较
在笔试上碰到很多这样类似的题,全部整理到这里 String a = "Hello"; String b = "Hello"; String c = new St ...
- 数据库MHA故障分析
一.故障分析 1.MHA故障以后是否正常:不正常 2.如果master恢复了?MHA还能自动恢复吗?:不能 3.主从恢复删除此文件 rm saved_master_binlog_from_192 ...
- 寻找最佳路径(ArcPy实现)
一.背景 随着社会经济发展需求,公路的重要性日益提高.在一些交通欠发达的地区,公路建设迫在眉睫.如何根据实际地形情况设计出比较合理的公路规划,是一个值得研究的问题. 二.实验目的: (1)通过练习,熟 ...
- AT3950 [AGC022E] Median Replace
题目传送门 Description 有一个长度为 \(n\) 的 \(01\) 串,里面有一些还没有确定,我们标记为 ? .可以进行若干次操作,每次操作可以把三个相邻的数替换成它们的中位数.问有多少种 ...
- 使用CSS选择器(第一部分)
目录 使用CSS选择器(第一部分) 使用CSS基本选择器 选择所有元素 通用选择器 代码清单1 使用通用选择器 根据类型选择元素 元素类型选择器 代码清单2 使用元素类型选择器 提示 根据类选择元素 ...
- JavaScript表单输入合法控制
写在前面 为了提高数据输入的容错性和数据库数据的安全性,除了后端对输入的数据的逻辑判断处理,还可以前端页面高效率处理,从而提高系统的可靠性,下面是这次项目中的自己写的一些符合当时需要的控制. 账号位数 ...
- FastAPI 学习之路(九)请求体有多个参数如何处理?
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- 【c++ Prime 学习笔记】第10章 泛型算法
标准库未给容器添加大量功能,而是提供一组独立于容器的泛型算法 算法:它们实现了一些经典算法的公共接口 泛型:它们可用于不同类型的容器和不同类型的元素 利用这些算法可实现容器基本操作很难做到的事,例如查 ...