【问题标题】:building log4cxx in vs 2010 c++在 vs 2010 c++ 中构建 log4cxx
【发布时间】:2012-08-22 09:10:18
【问题描述】:

这让我发疯,我正在尝试构建 log4cxx 库以便在我一直使用的 c++ 项目中使用。我在运行 VS2010 express c++ 版本的 win7 主机上。我已按照 log4cxx 说明 () 中的说明进行操作,包括下载 apr 和 apr-util 和 motying .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 Studio 怎么样?有没有更简单的方法?

标签: c++ visual-c++ log4cxx


【解决方案1】:

要使用 Visual Studio 2015 在 Windows 7 64 位上构建 log4cxx,除了 Scott 的回答之外,我还必须执行几个步骤,并进行一些说明。

  1. here下载最新的log4cxx (apache 0.10.0) ZIP 包。
  2. here 下载 apr 和 apr-util ZIP 包。
  3. 将 log4cxx、apr 和 apr-util 提取到同一目录。
  4. 来自官方说明和 seves 的回答: 将 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_iterator 中的stringhelper.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”。

【讨论】:

  • 感谢您的回答。您还记得自从链接更新为最新版本后使用的正确版本的 apr 和 apr utili 吗?
  • @AndreaRossi 我使用的是 apr 1.5.2 和 apr-util 1.5.4
  • 谢谢。可以分享一下这个项目的源码吗?
【解决方案2】:

第一章官方步骤

我们将按照此处的步骤进行操作,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 添加到相关文件中

  2. 完成!享受你的 log4cxx!

【讨论】:

    【解决方案3】:

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

    1. here下载最新的log4cxx包
    2. here 下载 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 &lt;iterator&gt; 添加到源文件的包含部分。

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


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

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

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

    【讨论】:

    • log4cxx 是死项目吗?
    • @seveves 你好,可以重新上传源代码吗?
    【解决方案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 成功构建了该项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2013-01-03
      • 1970-01-01
      • 2011-03-28
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多