心血来潮要去看开源代码,看到公司的日志库是在google-glog开源库上二次封装的,那就先撸glog吧.
1. 下载源码
一条命令取源码:git clone github.com/google/glog
2. 编译库文件
双击打开,右键编译,看到succeed,心情还不错~
3. 其他工程调用
a. 建工程
b. 拷贝头文件
c. 放置lib文件
d. 放置dll文件
e. TestDemo工程配置
配置一:
配置二:
配置三:
f. 运行
g. 一脸懵逼
h. 结论
洗洗睡吧 !
编译使用第二发
1. 痛定思痛,痛何如哉?
2. 原因分析
简单的调用都出问题,不爽,看源码。
我的Demo调用了这个宏来输出
接着找到这个宏
调用了非C++基础库文件。问题找到。
原因在于,dll库文件在编译的时候,调用了非基础库的类。这个类在每个不同的编译器上实现可能都不同,因此,用VS2008编译,用VS2013调用会出问题, 问题表现为指针错误。
并且静态库一定要编译器版本号对应。
解决方案也很简单,VS2013编译库文件---->VS2013调用 VS2008编译库文件---->VS2008调用
3. 纠正错误
改用VS2013编译的库,问题解决
4. 学到的东西
a. 库文件调用,产生异常的内存读取错误等等...为库文件版本问题。
b. 通用的库文件,动态库,必须使用C++基本数据类型编译才可通用。
c. 静态库一定需要编译器版本相同。
d. 静态库版本错误会导致各种链接错误。
e. 本机编译的dll文件,在调用的时候可以直接连接到源文件,比较好调试
测试代码:
1 #include <iostream> 2 3 #include "glog/logging.h" 4 5 int main() 6 { 7 google::InitGoogleLogging("log"); 8 google::SetLogDestination(google::GLOG_INFO, "./myinfo"); 9 LOG(INFO) << "嘿嘿..."; 10 LOG(WARNING) << "呵呵..."; 11 LOG(ERROR) << "嘻嘻..."; 12 LOG(FATAL) << "哈哈..."; 13 LOG(INFO) << "嘤嘤..."; 14 15 return 0; 16 }
5. 最后总结
老感觉少写了点啥, 非常感谢同事WJ的帮助, 编程之路一个人独行确实很难走下去,每次爆出束手无策的错误,总是让人很迷茫.
有些经验并不是搜索引擎能搜的到的. 乐于助人乐于分享的大牛们,都是我的榜样.