编译静态库的方式使用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简单算法的实现
#coding=utf-8 #!/usr/bin/python def GCD(a,b): """ :求两个数的最大公约数 :param a: :param b: :re ...
- P3180-[HAOI2016]地图【圆方树,莫队,分块】
正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 \(n\)个点\(m\)条边的一个仙人掌,有点权. \(Q\)次询问给出\(op,x,y\),封 ...
- Linux系统自我学习的一些笔记1
远程连接: 1.查看IP地址 ip addr 2.远程登陆linux系统 ssh 主机名@IP地址 文件操作: 新建文件touch 例如:touch test.txt (创建单个文件) 例如:to ...
- ❤️【Python从入门到精通】(二十六)用Python的PIL库(Pillow)处理图像真的得心应手❤️
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本篇重点介绍Python处理图像的标准库PIL库,处理图像真的的很方便. 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题及需要,欢迎踊跃 ...
- Jetpack Compose学习(6)——关于Modifier的妙用
原文: Jetpack Compose学习(6)--关于Modifier的妙用 | Stars-One的杂货小窝 之前学习记录中也是陆陆续续地将常用的Modifier的方法穿插进去了,本期就来详细的讲 ...
- C语言实现简易计算器(可作加减乘除)
C语言实现简易计算器(加减乘除) 计算器作为课设项目,已完成答辩,先将代码和思路(注释中)上传一篇博客 已增添.修改.整理至无错且可正常运行 虽使用了栈,但初学者可在初步了解栈和结构语法后理解代码 # ...
- 微信小程序应用安全分析及设计
针对微信关于小程序安全设计的分析 针对微信小程序开发配置及部分配置机制分析微信小程序安全设计: AppSecret 管理员生成AppSecret,在与微信后台交互过程中部分接口使用,如 auth.co ...
- mysql增删改查——条件查询+模糊查询
条件查询一般是 = 等于 >大于 <小于 >=大于等于 <=小于等于 <>区间 between and区间 or并且 and或者 in包含 like模糊查询 实例, ...
- 洛谷4248 AHOI2013差异 (后缀数组SA+单调栈)
补博客! 首先我们观察题目中给的那个求\(ans\)的方法,其实前两项没什么用处,直接\(for\)一遍就求得了 for (int i=1;i<=n;i++) ans=ans+i*(n-1); ...
- NOI2018屠龙勇士(扩展CRT + splay(multiset))
QWQ 一到假期就颓废 哎 今年新鲜出炉的NOI题,QwQ同步赛的时候写的,后来交了一发洛谷,竟然过了 首先 根据题目,我们很容易得到,假设对应每一条龙的剑的攻击力是\(atk\)的话 \[a_i-x ...