!!版權聲明:本文為博主原創文章,版權歸原文作者和博客園共有,謝絕任何形式的 轉載!!
作者:mohist
注意:
請選擇對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, 總結其使用方法。
特別說明: 使用項目執行安裝,其實就是將源碼目錄下include下的spdlog文件夾拷貝到系統的目錄下。 踩坑總結: 要想在項目中使用 #include<XXX.h>的方式包含頭文件,與VS的安裝路徑有關,我沒有嘗試過默認安裝VS的情況,我的VS是自定義安裝路徑的。
這里需要將 include下的spdlog 文件夾拷貝到VS的安裝路徑下,具體見下面:
我的VS安裝路徑:
C:\major\development\tools\vs_install\vs_2015\
那么需要將include下的spdlog文件夾拷貝到:
C:\major\development\tools\vs_install\vs_2015\VC\include
這樣, 就可以在代碼中使用 #include <xXX,h>的方式了
--------- 方案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的情況為准。本文僅為參考。