前一节讲了最简单的C++程序框架,其中日志是向屏幕输出的,我们今天采用glog把日志写到文件里。同时也简单讲讲在Windows下cmake的使用和VC2017的使用。

一 开发工具

Windows使用VS, 首先安装好开发工具,微软官方下载VS,社区版就可以:https://visualstudio.microsoft.com/zh-hans/

当前最新版本是vs2019,本文使用是vs2017,安装文件实在是太大,没有更新到2019,大家随意。

 Linux的开发环境比Windows简单多了,配置好makefile(也可以使用cmake)就完事。

本文不打算写成水文,尽可能不注水,所以关于Linux操作,vc++的使用,vim的使用,以及makefilecmakegccg++等都不做解释。

顺便推荐几本书做为C++编程的基础:K&RC语言编程,Lippman的 Essential c++,  有时间再细看C++ Primer,然后具体做Windows开发的可以看Windows核心编程,Linux下开发可以看Unix高级编程或Linux/UNIX系统编程手册。都有英文版本,建议直接看英文。

cmake准备

很多开源代码的编译需要cmake,我们直接下载安装。https://cmake.org/download/,选择合适版本。

glog编译

glog当前(202085日)最新版本是0.4,下载地址:https://github.com/google/glog/releases/tag/v0.4.0

Linux系统下载 https://github.com/google/glog/archive/v0.4.0.tar.gz

Windows系统下载https://github.com/google/glog/archive/v0.4.0.zip

下载后进行编译,Linux下极简单,官方只说了一句话:./autogen.sh && ./configure && make && makeinstall

Windows下可以安装mingw等模拟Linux环境,同样运行这句话。

本文以后重点介绍Windows

1 使用cmake生成vc工程。

打开cmake-gui.exe,显示如下窗口:
C++工程 1.2 使用glog写日志-LMLPHP


最上面表示下载的源码所在位置,下面的表示编译生成的文件保存位置。下面是本文机器的位置:

C++工程 1.2 使用glog写日志-LMLPHP


1和2是刚才说的源码路径和生成文件路径。3是配置,点击后cmake会自动查找系统所需要的依赖。配置之后,再点击4生成VS工程。

点击3,还会弹出一个选项,一般选择64位系统。

然后 finish。运行过程中会报错:
C++工程 1.2 使用glog写日志-LMLPHP



大意是需要gflas

这里有两个方案:

1 下载gflags,编译生成再来编译glog

2 不需要glfags

本文采用方案2,在cmake gui中,选Advanced然后把WITH_GFLAGS的勾选去掉:

C++工程 1.2 使用glog写日志-LMLPHP

再回到第一步, cmake配置glog,正确填写gflas路径,就解决了。

然后点击Generate,再Open Project。打开VS开始编译, 一切顺便的话如下图:


C++工程 1.2 使用glog写日志-LMLPHP


然后把编译目录下的include,lib文件复制到自己的源码目录下,再VS中配置一下:

项目属性一定要设置成x64的:

C++工程 1.2 使用glog写日志-LMLPHP

附加包含目录中要写上头文件位置:
C++工程 1.2 使用glog写日志-LMLPHP


预编译头选择不用。

然后,在前面代码基础上稍加几行代码就可以了。完整代码如下:



点击(此处)折叠或打开

  1. #include <iostream>// stl cout
  2. #include <signal.h>//signal头文件
  3. #include <chrono> //stl chrono头文件,时间工具,可以精确到,可以精确到纳秒
  4. #include <thread> //stl thread

  5. #include "include/glog/logging.h"
  6. #pragma comment(lib, "lib/Release/glog.lib")
  7. using namespace google;


  8. static int signaled = 0;
  9. static void sigterm_handler(int sig)
  10. {
  11.     signaled = 1;
  12. }

  13. class App
  14. {
  15. public:
  16.     void run()
  17.     {
  18.         //std::chrono::milliseconds可以是以下四个中的一个:seconds,milliseconds,microseconds,nanoseconds
  19.         uint64_t start_millseconds = std::chrono::duration_cast<std::chrono::milliseconds>
  20.             (std::chrono::system_clock::now().time_since_epoch()).count();
  21.         for (;;)
  22.         {
  23.             if (signaled == 1)
  24.                 break;
  25.             else
  26.             {
  27.                 std::cout << "运行毫秒数:" << std::chrono::duration_cast<std::chrono::milliseconds>
  28.                     (std::chrono::system_clock::now().time_since_epoch()).count() - start_millseconds << std::endl;

  29.                 //c++11支持u8转utf8,否则写到文件里乱码
  30.                 LOG(INFO) << u8"运行毫秒数:" << std::chrono::duration_cast<std::chrono::milliseconds>
  31.                     (std::chrono::system_clock::now().time_since_epoch()).count() - start_millseconds ;
  32.                 std::this_thread::sleep_for(std::chrono::seconds(1));
  33.             }
  34.         }
  35.     };
  36. };


  37. int main()
  38. {
  39.     google::InitGoogleLogging("demo2.exe");//
  40.     google::SetLogDestination(google::GLOG_INFO, "demo2_");
  41.     LOG(INFO) << "Hello World!";
  42.     std::cout << "Hello World!\n";
  43.     signal(SIGINT, sigterm_handler); //ctrl + c中断


  44.     App app;
  45.     app.run();
  46.     std::cout << "Exit!\n";
  47.     LOG(INFO) << "Exit!";
  48.     std::this_thread::sleep_for(std::chrono::seconds(1));

  49.     google::ShutdownGoogleLogging();
  50.     return 0;
  51. }

同样放到github上了:https://github.com/sxcong/cpp_project_in_action/blob/master/demo2/main.cpp

运行结果后,在文件目录下生成一个新的文本文件,用编译工具打开,就看到显示内容。
比如:
C++工程 1.2 使用glog写日志-LMLPHP

文件内容:

C++工程 1.2 使用glog写日志-LMLPHP



最后,对代码简单做一下解释:
glog使用,在程序起始位置加:
google::InitGoogleLogging("demo2.exe");// 
google::SetLogDestination(google::GLOG_INFO, "demo2_");

第一行是进程名,第二行是保存位置和文件名。
程序结束时调用:
google::ShutdownGoogleLogging();

glog功能很多,比如可以设置文件名格式,日志文件大小等。还可以修改源码实现自己想要的功能。有时间可以看看代码以及附带的sample。




09-05 02:56