在项目中需要添加日志系统,网上找了几个c++的日志系统,发现c++中的日志系统log4xx,log4cplus,glog文档都比较少,然后就一个个尝试,glog首先被排除外了,它好像不能对输出进行配置。然后重点放在了log4xx和log4cplus上面,它们的名字和log4j比较类似,貌似也是apache项目的产物。首先尝试的是log4xx,但是它的配置比较麻烦,除了在apache的链接中下载了log4cxx的源码包外,好像还需要两个源码包,分别是apr和apr-util的源码包,下载以后编译的过程中又遇到了sed命令找不到的错误,总之搞了很久也没搞定,所以接着尝试使用log4cplus。
自己的机器中装的是vs2008,log4cplus现在还在更新,这点相对于另外几个日志系统就好多了,因为另外几个日志系统已经不更新了。但是下载了log4cplus的最新版,也就是1.1.1的版本后发现源码包中只有msvc10这个文件夹,凭着自己少的可怜的vs知识了解到这个文件夹里的vs工程需要使用vs2010或者vs2010以上的版本才可以编译。但是在里面看到了CMakeLists.text这个文件,就想着看能不能使用cmake生成能在vs2008中编译的版本,接着就使用cmake了,在genenate那一步中提示找不到KERNAL.lIB等一系列库文件,蛮奇怪的是那些库文件好像都是系统核心的库文件,我好像也在system32文件夹中看到过那些库文件,但是不知道为什么cmake没找到,在网上查了一会儿也没找到原因,没办法只好继续想办法了。
接下来想到找log4cplus早期的版本应该能使用vs2008进行编译了吧?所以在网上找了log4cplus-1.0.3-rc9这个版本,里面有msvc6和msvc8这两个文件夹,非常高兴因为msvc8就是vs2008的工程了,果断打开了msvc8这个文件夹,然后打开了log4cplus.sln文件,如下图:
最开始是准备使用静态库的,所以在log4cplus_static这个项目中进行了配置。自己的项目中使用的是多字节字符集,所以分别将log4cplus的debug版本和release版本的字符集都改成多字节字符集。
主要进行了一下几步操作:
首先选中log4cplus_static这个项目,右键点击,在弹出的菜单中选中属性。
“配置属性->字符集->使用多字节字符集”
编译完成后分别将生成的log4cplusS.lib和log4cplusSD.lib放在一个lib文件夹里,然后将log4cplus源码中的include文件复制到了lib同一级目录中,将lib和include目录放在了自己创建的log4cplus文件夹中方便管理。最后在vs2008的“工具->选项->项目和解决方案->vc++目录”中将lib文件夹和include文件夹加了上去。然后在自己的工程中也按照网上的说法在“项目->属性->配置属性->C/C++->预处理器->预处理器定义”中加入LOG4CPLUS_STATIC,在“项目->属性->配置属性->链接器->输入->附加依赖项”中添加了log4cplusS.lib
但是运行程序中发现报了一大堆link 2005的异常,现在也不记得异常的详细信息了,好像是MSVCPRT.LIB库中的一大堆东西在log4cplusS.lib中重复定义了,于是我在项目的“项目->属性->配置属性->链接器->输入->忽略特定库”中添加上了MSVCPRT.LIB这个库,然后程序能够运行了,但是也报了很多warn警告,使用简单的日志功能也能将日志信息输出到文件中,可是想想不对劲,MSVCPRT.LIB库能随便忽略掉吗?虽然忽略掉这个库后程序运行起来了,可是也报了一大堆的警告,最重要的是这个库是C++运行库,msdn上也有说明(http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx),忽略掉这个库后要是再出其他问题了怎么办,而且接下来使用log4cplus时也出现了问题,就是不能使用配置文件,使用配置文件时输出的日志文件中没内容,然后花了2天时间都没解决这个问题。
最后实在无奈了,尝试使用生成动态库的办法,就是选择了log4cplus_dll这个项目,然后修改了它的字符集(方法同生成静态库),生成了项目,生成的Release和Debug版本中除了对应的dll文件外都有一个对于的lib文件。Release文件夹中有log4cplus.dll和log4cplus.lib,Debug文件夹中有log4cplusD.dll和log4cplusD.lib,然后使用同静态编译的方法一样建了个log4cplus文件夹,里面有include,bin,lib,然后将.lib文件拷贝到lib文件夹,将.dll文件拷贝到了bin文件夹,include文件夹里的内容和静态编译时一样都是源码中的那个include文件夹。然后在“工具->选项->项目和解决方案->vc++目录”中将lib,include,bin加了上去。在“项目->属性->配置属性->链接器->输入->附加依赖项”中添加了log4cplus.lib。但是奇怪的是在运行程序时提示找不到log4cplus.dll。这个错误蛮奇怪的,明明在vs2008目录中添加了log4cplus.dll的目录,但是为什么编译器找不到,没办法,只好尝试着将log4cplus的lib文件,bin文件,include文件直接拷贝到vs2008的目录中。
如下:
将log4cplus.dll,log4cplusD.dll拷贝到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin下;
将log4cplus.lib,log4cplusD.lib拷贝到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib下;
将include中的log4cplus文件夹拷贝到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include下
最后运行程序成功了,能使用配置文件进行配置,没报任何错误和警告!
最后附上自己使用Visual Studio编译的log4cplus的32位和64位库:
32位库 64位库