前一节讲了最简单的c 程序框架,其中日志是向屏幕输出的,我们今天采用glog把日志写到文件里。同时也简单讲讲在windows下cmake的使用和vc2017的使用。
一 开发工具
windows使用vs, 首先安装好开发工具,微软官方下载vs,社区版就可以:。
当前最新版本是vs2019,本文使用是vs2017,安装文件实在是太大,没有更新到2019,大家随意。
linux的开发环境比windows简单多了,配置好makefile(也可以使用cmake)就完事。
本文不打算写成水文,尽可能不注水,所以关于linux操作,vc 的使用,vim的使用,以及makefile、cmake、gcc、g 等都不做解释。
顺便推荐几本书做为c 编程的基础:k&r的c语言编程,lippman的 essential c , 有时间再细看c primer,然后具体做windows开发的可以看windows核心编程,linux下开发可以看unix高级编程或linux/unix系统编程手册。都有英文版本,建议直接看英文。
二 cmake准备
很多开源代码的编译需要cmake,我们直接下载安装。,选择合适版本。
三 glog编译
glog当前(2020年8月5日)最新版本是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 && make
install。
windows下可以安装mingw等模拟linux环境,同样运行这句话。
本文以后重点介绍windows。
1 使用cmake生成vc工程。
打开cmake-gui.exe,显示如下窗口:
最上面表示下载的源码所在位置,下面的表示编译生成的文件保存位置。下面是本文机器的位置:
1和2是刚才说的源码路径和生成文件路径。3是配置,点击后cmake会自动查找系统所需要的依赖。配置之后,再点击4生成vs工程。
点击3,还会弹出一个选项,一般选择64位系统。
然后 点finish。运行过程中会报错:
大意是需要gflas。
这里有两个方案:
1 下载gflags,编译生成再来编译glog。
2 不需要glfags。
本文采用方案2,在cmake gui中,选advanced然后把with_gflags的勾选去掉:
再回到第一步, cmake配置glog,正确填写gflas路径,就解决了。
然后点击generate,再open project。打开vs开始编译, 一切顺便的话如下图:
然后把编译目录下的include,lib文件复制到自己的源码目录下,再vs中配置一下:
项目属性一定要设置成x64的:
”附加包含目录”中要写上头文件位置:
预编译头选择不用。
然后,在前面代码基础上稍加几行代码就可以了。完整代码如下:
-
#include <iostream>// stl cout
-
#include <signal.h>//signal头文件
-
#include <chrono> //stl chrono头文件,时间工具,可以精确到,可以精确到纳秒
-
#include <thread> //stl thread
-
-
#include "include/glog/logging.h"
-
#pragma comment(lib, "lib/release/glog.lib")
-
using namespace google;
-
-
-
static int signaled = 0;
-
static void sigterm_handler(int sig)
-
{
-
signaled = 1;
-
}
-
-
class app
-
{
-
public:
-
void run()
-
{
-
//std::chrono::milliseconds可以是以下四个中的一个:seconds,milliseconds,microseconds,nanoseconds
-
uint64_t start_millseconds = std::chrono::duration_cast<std::chrono::milliseconds>
-
(std::chrono::system_clock::now().time_since_epoch()).count();
-
for (;;)
-
{
-
if (signaled == 1)
-
break;
-
else
-
{
-
std::cout << "运行毫秒数:" << std::chrono::duration_cast<std::chrono::milliseconds>
-
(std::chrono::system_clock::now().time_since_epoch()).count() - start_millseconds << std::endl;
-
-
//c11支持u8转utf8,否则写到文件里乱码
-
log(info) << u8"运行毫秒数:" << std::chrono::duration_cast<std::chrono::milliseconds>
-
(std::chrono::system_clock::now().time_since_epoch()).count() - start_millseconds ;
-
std::this_thread::sleep_for(std::chrono::seconds(1));
-
}
-
}
-
};
-
};
-
-
-
int main()
-
{
-
google::initgooglelogging("demo2.exe");//
-
google::setlogdestination(google::glog_info, "demo2_");
-
log(info) << "hello world!";
-
std::cout << "hello world!\n";
-
signal(sigint, sigterm_handler); //ctrl c中断
-
-
-
app app;
-
app.run();
-
std::cout << "exit!\n";
-
log(info) << "exit!";
-
std::this_thread::sleep_for(std::chrono::seconds(1));
-
-
google::shutdowngooglelogging();
-
return 0;
-
}
同样放到github上了:
运行结果后,在文件目录下生成一个新的文本文件,用编译工具打开,就看到显示内容。
比如:
文件内容:
最后,对代码简单做一下解释:
glog使用,在程序起始位置加:
google::initgooglelogging("demo2.exe");//
google::setlogdestination(google::glog_info, "demo2_");
第一行是进程名,第二行是保存位置和文件名。
程序结束时调用:
google::shutdowngooglelogging();
glog功能很多,比如可以设置文件名格式,日志文件大小等。还可以修改源码实现自己想要的功能。有时间可以看看代码以及附带的sample。
阅读(3801) | 评论(0) | 转发(0) |