在vs c ++ c ++中构建log4cxx

Lex*_*con 11 c++ log4cxx visual-c++

这让我发疯,我正在尝试构建log4cxx库,以便在我一直在使用的c ++项目中使用.我正在运行VS2010 express c ++版的win7主机上.我遵循log4cxx指令()的指示,包括下载apr和apr-util以及动机.hw文件,但不幸的是,当我尝试加载log4cxx.dsw解决方案并将其转换为当前的VS时,我尝试生成apr.apr/dsw和一堆其他依赖的.dsw文件时收到错误.有什么建议?

具体来说,我所看到的是:

The Project file 'C:\...projects\apr-util\xml\expat\lib\xml.dsp' cannot be loaded. Do you want to remove the unloadable project from the solution?
Run Code Online (Sandbox Code Playgroud)

我看到了一堆其他的.dsp文件.

然后在VC的输出框中:

C:\Users\x\Documents\Visual Studio 2010\Projects\apr\apr.dsp : error  : Project upgrade failed.

C:\Users\x\Documents\Visual Studio 2010\Projects\apr-util\xml\expat\lib\xml.dsp : error  : Project upgrade failed.

C:\Users\x\Documents\Visual Studio 2010\Projects\apr-util\aprutil.dsp : error  : Project upgrade failed.

C:\Users\x\Documents\Visual Studio 2010\Projects\apache-log4cxx-0.10.0\projects\log4cxx.dsp : error  : Project upgrade failed.
Run Code Online (Sandbox Code Playgroud)

谢谢

文件位于正确的路径中.

sev*_*ves 23

您必须按照以下步骤使log4cxx(版本0.10.0)与VS2010一起使用:

  1. 这里下载最新的log4cxx包
  2. 这里下载apr和apr-util ZIP包
  3. 将log4cxx,apr和apr-util解压缩到同一目录
  4. 将apr_VERSION和apr-util_VERSION文件夹重命名为apr和apr-util,从而生成一个包含三个文件夹的目录:apache-log4cxx-0.10.0,apr和apr-util
  5. 切换到log4cxx目录并执行configure.bat
  6. 更改为apr-util/include direcotry并apu.hw在您选择的texteditor中打开
  7. 找到该条目#define APU_HAVE_APR_ICONV,将其设置为0并保存文件
  8. apr_ldap.hw从同一目录打开并找到该条目#define APR_HAS_LDAP,将其设置为0并保存文件.
  9. 切换到log4cxx/projects目录并使用VS2010打开log4cxx.dsw.使用yes/ok回答VS2010的转换提示,每个项目(apr,apr-util,log4cxx,xml)

好的,如果您现在点击构建,那么您将看到大约2000个错误,这是有趣和"硬"部分开始的地方:

  • 按Ctrl + F并查找"LOG4CXX_LIST_DEF"宏的每个条目.您必须将这些条目移出相关类,并且在同一个类之前.有时你需要移动一个typedef或者在宏之前添加类.

一些例子:

    // telnetadapter.h
    ...
    typedef log4cxx::helpers::SocketPtr Connection;
    LOG4CXX_LIST_DEF(ConnectionList, Connection);
    class LOG4CXX_EXPORT TelnetAppender : public AppenderSkeleton
    ...

    // appender.h
    ...
    class Appender;
    LOG4CXX_PTR_DEF(Appender);
    LOG4CXX_LIST_DEF(AppenderList, AppenderPtr);

    class Layout;
    typedef log4cxx::helpers::ObjectPtrT<Layout> LayoutPtr;

    ...

    class LOG4CXX_EXPORT Appender :
                public virtual spi::OptionHandler
    {
    ...
Run Code Online (Sandbox Code Playgroud)
  • 如果编译器抱怨KeySet不是LoggingEvent的成员,只需删除范围(因为我们在上一步中将类型移动到类外部,这些类型不再在类中)

例:

   // old
   LoggingEvent::KeySet set;
   // new
   KeySet set;
Run Code Online (Sandbox Code Playgroud)
  • 如果编译器抱怨insert_iterator不在命名空间std中,请添加#include <iterator>到源文件的include部分.

  • 最后但并非最不重要的是,右键单击log4cxx项目并选择Add References并选择其他3个项目作为参考


希望这可以帮助您和其他人:) ...如果您需要整个解决方案或其他文件,请告诉我们!

我想通了这些步骤的极大的帮助这个由Lex李博客条目.

编辑: 您可以从我的保管箱下载我的VS2010解决方案和源代码:https: //www.dropbox.com/s/rn5d0044jzgzwyf/log4cxx_vs2010.7z