1

我正在尝试使用 log4cplus 在 C++ 应用程序中实现日志记录。我能够成功构建/链接(我将 log4cplus.lib 添加到我的附加库并将 log4cplus.dll 复制到构建/outdir)

当我运行我的应用程序时,当它执行我的 Logger::getInstance 调用时出现以下异常:

LogTesterConsole.exe 中 0x75cad36f 处的未处理异常:Microsoft C++ 异常:内存位置 0x0013ed8c 处的 std::bad_alloc..

我尝试将调用放在我的 main() 例程之外以及内部,并得到相同的结果。

有任何想法吗?

代码:-

 #include "stdafx.h"
 #include <log4cplus/logger.h>
 #include <log4cplus/loggingmacros.h>
 #include <log4cplus/configurator.h>
 using namespace log4cplus;
 int _tmain(int argc, _TCHAR* argv[])
 { 
   BasicConfigurator config;
   config.configure();
   Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));
   LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));
   return 0;
 }
4

3 回答 3

1

如果您在调试中构建应用程序,请务必链接到 lib4CplusD.lib 和 lib4CplusD.dll。同样,发布应用程序应该链接 aginst lib4cplus.lib 和 lib4cplus.dll 我有相同的运行时错误,当我将调试应用程序与调试库链接时,问题得到了解决。

于 2012-11-13T23:41:11.773 回答
0

尝试:-

int _tmain(int argc, _TCHAR* argv[])
 { 
   PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.properties"));
   Logger root = Logger::getRoot();
   try{
   Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));
    }
   catch(...) {
        cout << "Exception..." << endl;
        LOG4CPLUS_FATAL(root, "Exception occured...");
    }
   LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));
   return 0;
 }
于 2012-09-01T18:51:49.847 回答
0

我知道这篇文章有点老了,但是当我昨天开始尝试 log4cplus v2.0.0 时遇到了完全相同的问题。

简短的回答:这是一个调试/发布构建问题。

现在为任何人拒绝更长的答案:

  • 我在这里下载了 log4cplus (v2.0.0) 的最新稳定版本
  • 我在 VS2017 中打开了 Visual Studio Soultuin,./log4cplus-2.0.0/msvc14并制作了log4cplus-Project(Windows SDK v10.0.16299.0;Platform Toolset v141)的发布版本(unicode)。一切都很顺利。
  • 我制作了一个新的示例 C++-Solution 来尝试以前构建的 log4cplus。
  • 使用 log4cplus 的设置:
    • log4cplusU.lib作为附加依赖项添加到链接器
    • 添加log4cplusU.dll到输出目录
    • 将所有内容添加./log4cplus-2.0.0/include到附加包含中
  • 对示例解决方案进行调试构建 (x86)。一切正常。
  • 构建解决方案后,我点击“运行”以查看是否一切正常。

现在这就是我遇到@Josh 在他最初的帖子中描述的完全相同的问题的关键。现在实际的问题是,我制作了 log4cplus 的发布版本,但在我自己的应用程序的调试版本中使用了这个发布版本。

考虑到这一点,我制作了我自己的应用程序的发布版本,一切都像魅力一样!

我将完整的 VS2017 解决方案推送到了我的GitHub-repo,因此您可以“动手”重现问题。只需将此解决方案的配置更改为“调试”(x86)并观察它在运行时产生异常。将其更改为“Release”(x86)并观看它按预期工作!

于 2018-04-15T18:09:32.500 回答