log4cpp 相关的问题

来源:互联网 发布:模拟电路单片机 编辑:程序博客网 时间:2024/05/07 11:37

首先说编译:

     一般如果用vs2005 vs2008 的人,就别用log4cpp1.0.x 的版本吧,vs2010的建议用最新的版本。

先说vs2008的编译问题:

   这里网上很多的办法,都是一样的:

 

在 log4cpp-1.0/msvc6/  下面  ,打开 msvc6.dsw 文件

 

右键工程属性,选择 Custom Build Step ,选择 Command Line ,修改如下

 

if not exist $(OutDir) md $(OutDir)
"mc.exe" -h $(OutDir) -r $(OutDir) $(SolutionDir)NTEventLogCategories.mc
"RC.exe" -r -fo $(OutDir)\$(InputName).res $(ProjectDir)\$(InputName).rc
"link.exe" /MACHINE:IX86 -dll -noentry -out:$(OutDir)\NTEventLogAppender.dll $(OutDir)\$(InputName).res

mc :进程设置信息。

rc : 资源设置信息。

link :链接设置信息。

 

右键工程属性,选择 Custom Build Step ,选择 Outputs ,修改如下

$(OutDir)\NTEventLogAppender.dll

 

之后  添加  FactoryParams.cpp  和 Localtime.cpp 两个文件。

这两个文件一般在 /log4cpp-1.0/src/ 下面。

添加文件后,编译OK。

 

 

其次 ,要说注意点 :

 

    (1.  如果 只需要静态库的话,只需要编译log4cpp 工程就行了 。如果需要动态库,则 只需要编译log4cppdll 工程,编译以后包含一个 静态库和动态库

    (2.  在使用的时候,debug 模式下 使用 一定使用 debug 下编译的 log4cpp | log4cppdll  ,release 模式下 使用 一定使用 release 下编译的 log4cpp | log4cppdll

              不然 在使用某些函数的时候会莫名的崩掉。(一定要注意,使用的时候,搞错过几次。)

    (3.  第三点,就是如果使用配置文件的时候,注意log4cpp 里面进行加载文件的时候,这里传的相对路径,如果传的是绝对路径,log4cpp 是找不到的。

              (特指1.0.x,高版本的不太清楚,没有使用。)

 

如果 在编译 log4cpp 的时候,有问题,就去掉 "link.exe" /MACHINE:IX86 -dll -noentry -out:$(OutDir)\NTEventLogAppender.dll$(OutDir)\$(InputName).res  里面 的 红色的部分。

 

经过 昨天晚上一晚上的尝试,发现并不是log4cpp 加载配置文件 不支持 绝对路径,而是 ,在vs2005 和vs 2008 下面 ,log4cpp 里面用 的是 std::ifstream 进行文件操作,而在vs2005、vs2008 里面 std::ifstream  初始化的时候 ,如果 传入的是 中文路径,就会有 问题 ,从而导致 ,log4cpp 在 加载 路径的时候 直接 找不到 该文件。

下面是 log4cpp 里面的源码 :

   void PropertyConfiguratorImpl::doConfigure(const std::string& initFileName) throw (ConfigureFailure) {
 

// 在下面的 初始化的时候 ,出错。
  std::ifstream initFile(initFileName.c_str());

  if (!initFile)
  {
   throw ConfigureFailure(std::string("File ") + initFileName + " does not exist");
  }
  doConfigure(initFile);
    }

 


解决 办法 :

  可以修改log4cpp 里面的代码,进行重新编译,重新生成 dll 文件 。


解决 vs2008、vs2005 下 std::ifstream 初始化不支持 中文的办法 :



vs2008 、vs2005 下 std::ifstream 中不 支持 中文,是因为,在vs2008 、vs2005 下,默认 传入的 unicode 字符集 ,而我们一般开发的时候 大多数 使用的 多字节字符集,所以会导致 出错 。



1、使用C语言的函数设置为中文运行环境

setlocale(LC_ALL, "Chinese-simplified");

2、使用STL函数设置为系统语言环境

std::locale::global(std::locale(""));

3. 或者 直接 修改  log4cpp 的 参数,直接传入的是 宽字节 。



建议  :

         用 vs 进行编码的时候 ,最好 使用 unicode 字符集编码 , 因为 在内部 中, 会先将 Multi-Byte Character  转换成 unicode 然后 才进行 操作,直接使用 unicode 进行编码 可以提高  应用软件的 速度。