前言

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/

编译静态库的方式使用spdlog和fmt的更多相关文章

  1. 【iOS】编译静态库

    与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...

  2. Xcode 编译静态库

    有时候,我们需要将一部分经常用到的代码提取出来用来复用,或者说需要用到c++的代码的时候,可以通过编译成静态库的方式来使用.本文中使用的Xcode版本是8.3,静态库制作过程和其他版本基本一样,可能出 ...

  3. 关于使用Visual编译静态库动态库及其使用的问题

    本文主要讲述了如何使用Visual Studio 2013 编译静态库和动态库,并使用. 一.静态库 1.  编写静态库 若要创建将引用并使用刚创建的静态库的应用程序,请从“文件”菜单中选择“新建”, ...

  4. android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)

    android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在an ...

  5. 【转】TI DSP C6657学习之——编译静态库.lib

    熟悉C++开发的的小伙伴都知道,我们一般代码中往往要引入许多第三方编译好的库,有些是静态链接库static library, 有些是动态链接库dll.引入库的目的一是减少代码的编译时间,二是只提供函数 ...

  6. Makefile 编译静态库文件及链接静态库

    本文为原创文章,转载需指明该文链接 1.代码目录结构如下: comm/ comm/inc/apue.h  3 atexit.c Makefile  5 staticlib/lib/ staticlib ...

  7. opencv编译静态库时选择MD模式无效的原因

    在Cmake-gui上看到的明明是MD运行库依赖,生成MS项目时却变成了MT运行库依赖. 原因在于编译静态库时内部做了自动替换.

  8. Xcode 之自己编译静态库

    今天介绍下,如何利用Xcode,新建一个静态库,以及如何编译成i386.armv7.armv7s 等平台架构. 开发环境:MAC OS X 10.9.4 + Xcode 5.0.2 背景知识:库分两种 ...

  9. windows openssl-1.1.1 编译静态库和动态库

    一下为windows上安装过程 1.下载 openssl-1.1.0.tar.gz 2.安装 ActivePerl, 可以到http://www.activestate.com/activeperl/ ...

随机推荐

  1. appium+python自动化:获取元素属性get_attribute

    使用get_attribute()获取元素属性,括号里应该填写什么? 查看appium源码 如果是获取resource-id,填写resourceId self.driver.find_element ...

  2. Vulnhub实战-DockHole_1靶机👻

    Vulnhub实战-DockHole_1靶机 靶机地址:https://www.vulnhub.com/entry/darkhole-1,724/ 1.描述 我们下载下来这个靶机然后在vmware中打 ...

  3. Java初步学习——2021.10.12每日总结,第六周周二

    (1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了菜鸟教程Java实例,数组 1.数组的排序和元素的查找--sort和binarySearch方法 import j ...

  4. 洛谷4400 BlueMary的旅行(分层图+最大流)

    qwq 首先,我们观察到题目中提到的每天只能乘坐一次航班的限制,很容易想到建分层图,也就是通过枚举天数,然后每天加入一层新的点. (然而我一开始想的却是erf) 考虑从小到大枚举天数,然后每次新建一层 ...

  5. 洛谷4035 JSOI2008球形空间产生器 (列柿子+高斯消元)

    题目链接 qwq 首先看到这个题,感觉就应该从列方程入手. 我们设给定的点的坐标矩阵是\(x\),然后球心坐标\(a_1,a_2....a_n\) 根据欧几里得距离公式,对于一个\(n维空间\)的第\ ...

  6. CF280C Game on tree(期望dp)

    这道题算是真正意义上人生第一道期望的题? 题目大意: 给定一个n个点的,以1号点为根的树,每一次可以将一个点和它的子树全部染黑,求染黑所有点的期望 QwQ说实话,我对期望这种东西,一点也不理解... ...

  7. Frida高级逆向-Hook Native(Java So)2

    Frida Hook So 一些操作说明 Native方法第一个参数是 JNIEnv *env 如何在Frida中获取 JNIEnv 对象呢? Java.vm.getEnv(); 如何将string类 ...

  8. python socket 基本使用

    socket通常也叫做"套接字",用于连接server client,是一个通信链的句柄,应用程序通常通过套接字向网络发出请求或应答网络请求. 就像python 处理file一样: ...

  9. SpringCloud微服务实战——搭建企业级开发框架(四):集成SpringCloud+SpringBoot

    1.在GitEgg工程的根目录,最上级父pom.xml文件中引入需要依赖的库及Maven插件,设置编码方式: <!--?xml version="1.0" encoding= ...

  10. 【UE4 C++】编程子系统 Subsystem

    概述 定义 Subsystems 是一套可以定义.自动实例化和释放的类的框架.可以将其理解为 GamePlay 级别的 Component 不支持网络赋值 4.22开始引入,4.24完善.(可以移植源 ...