11

这让我发疯,我正在尝试构建 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.

谢谢

这些文件位于正确的路径中。

4

4 回答 4

24

您必须按照以下步骤使 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)用 yes/ok 回答 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
    {
    ...
  • 如果编译器抱怨 KeySet 不是 LoggingEvent 的成员,只需删除范围即可(由于我们在上一步中将类型移到了类外,这些类型不再在类内)

例子:

   // old
   LoggingEvent::KeySet set;
   // new
   KeySet set;
  • 如果编译器抱怨 insert_iterator 不在命名空间 std 中,请添加#include <iterator>到源文件的包含部分。

  • 最后但同样重要的是,右键单击 log4cxx 项目并选择添加引用并选择其他 3 个项目作为参考


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

在 Lex LI 的这篇博客文章的巨大帮助下,我想出了这些步骤。

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

于 2012-11-09T15:24:57.153 回答
4

人们已经通过 2 个步骤成功转换了 log4cxx:

  • 原始(VS 6)到 VS 2008
  • VS 2008 到 VS 2010

值得庆幸的是,有人在http://www.dreamcubes.com/webdrive/log4cxx_win32/log4cxx-0.10.0-vc2008-June2008.rar上将 log4cxx 0.10 作为 Visual Studio 2008 项目提供。我已经使用 VS 2010 Express 成功构建了该项目。

于 2012-05-08T22:54:20.323 回答
4

第一章 官方步骤

我们将按照此处的步骤进行操作, http: //logging.apache.org/log4cxx/building/vstudio.html。但是,我们必须进行更改以适应 windows/VS201*。

  1. 从这里下载更高版本的 log4cxx,即 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

以上 2 cmd 需要 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并保存文件

第2章构建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!

于 2016-05-05T16:40:25.287 回答
1

要使用 Visual Studio 2015 在 Windows 7 64 位上构建 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 命令行,cd 到 log4cxx 目录并执行“配置”。如果您尝试将其用于下一步,这将不适用于 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”。
    • 通过从 Git Bash 提示符运行 log4cxx 目录中的“configure-aprutil”来使用 Windows git 安装附带的 sed。
  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. 下一个错误将insert_iteratorstringhelper.cpp. 添加#include <iterator>到该文件。
  13. 然后出现链接错误:

    apr-1.lib(rand.obj) : error LNK2019: unresolved external symbol __imp__UuidCreate

    要解决此问题,请转到 log4cxx 属性 > 链接器 > 输入并添加rpcrt4.lib

  14. 现在应该构建解决方案,并且库将链接到您的 64 位应用程序。如果您只编辑一个,请重复调试/发布配置。

  15. (可选)该解决方案不会将常见的“d”后缀添加到调试库中。要添加它,请打开调试配置的属性。转到链接器 > 常规 > 输出文件并重置为默认值。转到链接器 > 高级 > 导入库并重置为默认值。对发布配置也这样做,以便它们将构建到相应的目录。仅对于 Debug 配置,转到 General,并在 Target Name 的末尾添加一个“d”。
于 2017-02-22T21:07:08.600 回答