1

log4cplus を使用して C++ アプリケーションにロギングを実装しようとしています。正常にビルド/リンクできました (追加のライブラリに log4cplus.lib を追加し、log4cplus.dll を build/outdir にコピーしました)。

アプリケーションを実行すると、Logger::getInstance 呼び出しを実行すると、次の例外が発生します。

LogTesterConsole.exe の 0x75cad36f で未処理の例外: Microsoft C++ 例外: std::bad_alloc メモリ位置 0x0013ed8c..

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 にリンクしてください。同様に、リリース アプリケーションは lib4cplus.lib と lib4cplus.dll にリンクする必要があります。同じランタイム エラーが発生しました。デバッグ アプリケーションをデバッグ ライブラリにリンクすると、問題は解決しました。

于 2012-11-13T23:41:11.773 に答える
0

この投稿は少し古いことは知っていますが、昨日 log4cplus v2.0.0 を試し始めたときにまったく同じ問題に遭遇しました。

簡単な答え: これはデバッグ/リリース ビルドの問題です。

誰もが再現するためのより長い答えについては、次のとおりです。

  • ここで log4cplus (v2.0.0) の最新の安定版リリースをダウンロードしました
  • VS2017 で Visual Studio Soultuinを開き、 -Project (Windows SDK v10.0.16299.0; Platform Toolset v141)./log4cplus-2.0.0/msvc14のリリース ビルド (Unicode) を作成しました。log4cplusすべてがうまくいきました。
  • 以前にビルドした log4cplus を試すために、新しいサンプル C++ ソリューションを作成しました。
  • 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 に答える
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 に答える