注意:
请选择对c++11 支持 完善的编译器, 为什么vs2013不行,因为: spdlog一直在更新,VS2013并没有完全支持C++11(踩坑总结)
1、准备:
A、spdlog 源码 : https://github.com/gabime/spdlog
B 、cmake gui: https://cmake.org/download/
C、vs2015 update3 or upper: 没有下载地址? 点我
2、配置
A、解压 spdlog 源码, 并打开解压后的文件夹,新建 build 文件夹
B、打开 cmake, 添加源码目录 和输出目录, 见下图:
C、点击 cmake UI的 configure. 这里演示,下面选择的的是win32。点击finish
D、configure 完成后, 选择合适的工程, 再点击 generate生成对应的 工程文件。
E、生成成功, 至此, 配置到此结束,
下面是使用方法: 踩坑总结:
1、按照 文档(https://github.com/gabime/spdlog/wiki)指示, 需要将库安装到操作系统的对应文件夹下去, 上面cmake中选择生成的项目: install 可实现安装。这样, 我们就可以像使用系统库文件一样使用他们了。 优点: 方便,无需修改代码,生成解决方案即可实现安装,新手省却很多麻烦,缺点: 相比直接拷贝到项目下使用(相对路径)而言,这样的方法灵活性不佳。
2、使用直接拷贝到项目文件夹下直接使用。优点: 方便灵活, 缺点,需要手动修改代码。
3、提出一种解决方案来解决2中出现的问题:封装。 例如: 动态链接库 或者 自己写一个类 将其封装起来,我们再使用类或者动态链接库的接口实现记录日志。欢迎留言其他的方案。
4、安装到系统指定目录下的方法称为: 方案1. 拷贝到项目文件夹下使用的方法称为: 方案2
-------------------------------------------------------------------------------------------------------------------------------------------------------------
方案1:
1、打开 cmake的输出目录(我这里是在 源码解压目录下build文件夹), (注意:请使用管理员方式打开VS201X ? 因为要将文件安装到指定的系统文件夹下,没有对应的权限,程序无法执行写入)打开解决方案 spdlog.sln (以实际生成的为准)。 若上面的配置你和我选择的一样,应该会得到下图的项目:
2、选择 项目: ALL_BUILD, 右键选择生成。
3、待上一步生成结束后, 选择 项目: INSTALL, 右键生成。 可以观察到输出窗口中 将 spdlog文件安装到系统的具体目录。
安装结束, 回到 spdlog教程: https://github.com/gabime/spdlog/wiki/1.-QuickStart . 试试自己的第一个spdlog把。也可以阅读 源码目录下的example文件夹下的example.cpp, 总结其使用方法。
--------- 方案1安装使用结束------------------------
下面是方案2的使用。
方案2 配置上没有 方案1复杂。只需要spdlog源码。 这里演示, 自己创建了一个空的 Visual c++ 项目, 并手动添加了一个源文件 main.cpp
步骤:
1、拷贝spdlog源码解压目录下的include文件夹到当前项目文件夹下。
2、直接在代码中对spdlog相关文件进行引用即可。
添加头文件以用。 ( spdlog有多种记录日志的方法,这里仅 演示一种, 正在摸索其他方法)
#include "include/spdlog/spdlog.h"h" #include "include/spdlog/sinks/rotating_file_sink.h"
添加对 spdlog的空间引用。
using namespace spdlog;
调用接口,记录日志:
int main() { // Create a file rotating logger with 5mb size max and 3 rotated files. auto rotating_logger_a = spdlog::rotating_logger_mt("log_file_a", "logs/ra.txt", 1024 * 1024 * 5, 100); // testing for (int i = 0; i < 1024 * 10; i++) { rotating_logger_a->info("index = {}", i); cout << "index = " << i << endl; } spdlog::shutdown(); system("pause"); return 0; }
完整源码如下:
// -------------------------------------------------------------------- // 下面是对sdplog的文件引用 #include "include/spdlog/spdlog.h" #include "include/spdlog/cfg/env.h" #include "include/spdlog/sinks/basic_file_sink.h" #include "include/spdlog/sinks/rotating_file_sink.h" #include <iostream> using namespace std; using namespace spdlog; int main() { // Create a file rotating logger with 5mb size max and 3 rotated files. auto rotating_logger_a = spdlog::rotating_logger_mt("log_file_a", "logs/ra.txt", 1024 * 1024 * 5, 100); // testing for (int i = 0; i < 1024 * 10; i++) { rotating_logger_a->info("index = {}", i); cout << "index = " << i << endl; } spdlog::shutdown(); system("pause"); return 0; }
3、编译 或者 ctrl + shift + B.。 发现输出 窗口中 提示错误:无法找到文件。
重点来了: 这就是我说的, 需要手动修改代码。 双击错误提示, 定位到下图:
改为下面的代码:
#include "include/spdlog/common.h" #include "include/spdlog/details/registry.h" #include "include/spdlog/logger.h" #include "include/spdlog/version.h" #include "include/spdlog/details/synchronous_factory.h"
再次编译, 还是提示相同的错误类型, 继续按照上面的方式改。改为相对路径。因为这些文件来自 拷贝 过来的 spdlog 源码。
重复编译,改, 这样的操作。 直到编译成功如下图:
F5, 运行结果:
成功。 证明可以正常使用spdlog的相关接口了。 再来看看 演示例子输出文件夹情况:
后记:
1、继续学习spdlog
2、针对方案2的缺点,可以 采用封装的方法,更好的为应用程序服务
3、偷懒: 若你也是按 方案2 操作的, 那就把 演示项目文件夹下的include下的spdlog拷贝一份。下次直接用,不用再次修改啦。
4、以实际的spdlog的情况为准。本文仅为参考。