在VS 2010 C++中构建log4cxx

12
这让我疯了,我正在尝试构建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?
我看到其他一些 .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.

谢谢

文件存储在正确的路径中。


2010年之后的Visual Studios呢?也许有更简单的方法吗? - Tomasz Gandor
4个回答

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目录,在文本编辑器中打开apu.hw。
  7. 找到条目#define APU_HAVE_APR_ICONV,将其设置为0并保存文件。
  8. 从相同目录中打开apr_ldap.hw,并查找条目#define APR_HAS_LDAP,将其设置为0并保存文件。
  9. 转到log4cxx/projects目录并使用VS2010打开log4cxx.dsw。对于每个项目(apr、apr-util、log4cxx、xml),回答VS2010的转换提示,选择“是/确定”。

好的,如果现在点击生成按钮,则会出现约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
    {
    ...
  • 如果编译器抱怨LoggingEvent中没有KeySet成员,只需删除作用域(由于我们在上一步中将类型移动到类的外部,因此这些类型不再位于类内部)
   // old
   LoggingEvent::KeySet set;
   // new
   KeySet set;
  • 如果编译器抱怨insert_iterator不在std命名空间中,请在源文件的include部分添加#include <iterator>

  • 最后,在log4cxx项目上右键单击,选择“添加引用”并选择其他3个项目作为引用。


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

我是在Lex LI的博客文章的巨大帮助下找到了这些步骤。

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


log4cxx是一个已经废弃的项目吗? - Sam Goldberg
@seveves 你好,能否重新上传源代码? - Andrea Rossi

4

4

第一章 官方步骤

我们将按照这里的步骤进行:http://logging.apache.org/log4cxx/building/vstudio.html。但是,我们必须进行一些更改以适应 Windows/VS201*。

  1. 从这里下载 Apache log4cxx 0.10 的最新版本:http://logging.apache.org/log4cxx/download.html

  2. https://archive.apache.org/dist/apr/下载依赖项。

  3. 官方构建指南非常容易遵循:

unzip apr-1.2.11-win32-src.zip
rename apr-1.2.11 apr
unzip apr-util-1.2.10-win32-src.zip
rename apr-util-1.2.10 apr-util
cd apache-log4cxx-0.10.0
configure
configure-aprutil
  1. 我建议你在开发机器上安装gow,这样你就会拥有许多类似Unix/Linux的工具,非常方便。或者如果你有git,你可以将git cmd工具添加到环境变量中。
configure
configure-aprutil

以上两个命令需要sed.exe,执行它们之前请安装它(gow/git)。或者您可以手动更改apu.hw和apr_ldap.hw:

打开apr_ldap.hw并找到条目#define APR_HAS_LDAP,将其设置为0并保存文件。

打开apu.hw并找到条目#define APU_HAVE_APR_ICONV,将其设置为0并保存文件。

第二章构建Log4cxx

  1. 现在我们需要将*.dsw转换为*.cxproj。为了使它顺利进行,只需启动Visual Studio 201*并打开log4cxx.dsw。VS会询问您是否要转换所有内容。只需点击“是”即可。

  2. 将log4cxx设置为启动项目。

  3. 打开项目log4cxx的属性窗口,将其他3个项目添加为引用,在这里:   属性 -> 公共属性 -> 框架和引用。
  4. 按F7键,如果看到错误c2252,则是因为LOG4CXX_LIST_DEF定义错误,请转到其定义并将其更改为

#define LOG4CXX_LIST_DEF(N, T) typedef std::vector<T> N

像这样:

旧的:

#define LOG4CXX_LIST_DEF(N, T) \
template class LOG4CXX_EXPORT std::allocator<T>; \
template class LOG4CXX_EXPORT std::vector<T>; \
typedef std::vector<T> N

新的:

#define LOG4CXX_LIST_DEF(N, T) typedef std::vector<T> N
  1. 如果你在使用insert_iterator时遇到了另一个错误,只需在相关文件中添加 #include<iterator> 即可。

  2. 完成!享受使用log4cxx吧!


1

在Windows 7 64位操作系统上使用Visual Studio 2015构建log4cxx时,除了Scott的回答之外,我还需要执行一些步骤,并进行一些澄清。

  1. 这里下载最新的log4cxx(apache 0.10.0)ZIP包。
  2. 这里下载apr和apr-util ZIP包。
  3. 将log4cxx、apr和apr-util解压到同一个目录中。
  4. 根据官方说明和seveves的答案:将apr_VERSION和apr-util_VERSION文件夹重命名为apr和apr-util,得到一个带有三个文件夹的目录:apache-log4cxx-0.10.0、apr和apr-util。
  5. 从Visual Studio命令行,进入log4cxx目录并执行“configure”。如果您尝试使用git bash shell进行下一步操作,则此方法无法工作。
  6. 下一个脚本需要sed,因此您有几个选择:
    • 按照其他答案中所述手动编辑文件。
      • 切换到apr-util/include目录并在您选择的文本编辑器中打开apu.hw。查找条目#define APU_HAVE_APR_ICONV,将其设置为0并保存文件。从相同目录中打开apr_ldap.hw并查找条目#define APR_HAS_LDAP,将其设置为0并保存文件。
    • 安装GNUWin32中的sed并将其添加到PATH中,然后从Windows命令提示符中从log4cxx目录运行“configure-aprutil”。
    • 使用随Windows git安装的sed,通过从Git Bash提示符中从log4cxx目录运行“configure-aprutil”。
  7. 打开Visual Studio 2015。从项目目录中打开log4cxx.dsw项目。让Visual Studio进行转换。
  8. 将log4cxx设置为启动项目并检查其他3个项目是否显示为依赖项(右键单击->生成依赖项->项目依赖项)
  9. 现在我有三个项目显示为它们旁边带有“(Visual Studio 2010)”。由于stdio的更改,这导致后来出现链接错误:

    4>apr-1.lib(start.obj) : error LNK2001: unresolved external symbol __imp__wenviron 4>apr-1.lib(start.obj) : error LNK2001: unresolved external symbol __imp__environ 4>apr-1.lib(filedup.obj) : error LNK2019: unresolved external symbol __imp___iob_func referenced in function apr_file_dup2

    通过进入每个项目的属性并将所有配置的“平台工具集”更改为Visual Studio 2015来更改此设置。

  10. 该解决方案现在已配置为32位。转到生成->配置管理器。将平台更改为x64。其中三个项目将更改,但log4cxx仍然说Win32。单击它并转到新建...添加x64并取消选中“创建新的解决方案平台”。单击确定。确保对所有4个项目都选中了“生成”。
  11. 如果现在构建,则会看到c2252模板错误。打开log4cxx.h
    • 将包含“#if defined(_MSC_VER) && !defined(LOG4CXX_STATIC) && defined(LOG4CXX)”的行更改为包含“#if defined(_MSC_VER) && _MSC_VER < 1700 && !defined(LOG4CXX_STATIC) && defined(LOG4CXX)”。
    • 将包含“#elif defined(_MSC_VER) && !defined(LOG4CXX_STATIC)”的行更改为包含“#elif defined(_MSC_VER) && _MSC_VER < 1700 && !defined(LOG4CXX_STATIC)”。
  12. 下一个错误将是关于stringhelper.cpp中的insert_iterator的错误。在该文件中添加#include <iterator>。
  13. 然后出现链接错误:

    apr-1.lib(rand.obj) : error


谢谢你的回答。你记得使用的apr和apr utili的正确版本吗?因为链接已经更新到最新版本了。 - Andrea Rossi
1
@AndreaRossi 我使用的是apr 1.5.2和apr-util 1.5.4。 - Yuriy
谢谢。你能分享这个项目的源代码吗? - Andrea Rossi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接