1

dll と実行可能ファイルは両方とも boost::log を使用します。それらは、異なるシングルトン ログ コアを使用することになります。dllコアを実行可能ファイルに公開し、dll-coreをexe-coreに登録して、両方を1つのログファイルにリダイレクトできるようにするにはどうすればよいですか。

どこでつまずいたかを説明するために、最小限の例を書きました。

LogUser.hpp

#pragma once

#ifdef DYNLIB_EXPORTS
#define DYNLIB_API __declspec(dllexport)
#else
#define DYNLIB_API __declspec(dllimport)
#endif

class DYNLIB_API LogUser
{
public:
    LogUser();
    ~LogUser() {}
};

LogUser.cpp

#include "LogUser.hpp"
#include <boost\log\trivial.hpp>
LogUser::LogUser()
{
    BOOST_LOG_TRIVIAL(trace) << "LogUser constructed";
}

メイン.cpp

#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>

#pragma comment (lib, "dynlib.lib")
#include <dynlib/LogUser.hpp>

void setupLogging();

int main()
{
    setupLogging();
    BOOST_LOG_TRIVIAL(trace) << "main enter";
    LogUser dynamicLogUser;
    BOOST_LOG_TRIVIAL(trace) << "main exit";
    return 0;
}

void setupLogging()
{
    using namespace boost::log;
    add_common_attributes();
    register_simple_formatter_factory< trivial::severity_level, char >("Severity");
    add_file_log
        (
        keywords::file_name = "file.log",
        keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%"
        );
}

LogUser は LogUser.dll にコンパイルされます。LogUser のコンストラクターは、最終的にコンソールに表示されるトレース メッセージを作成します。Main はその出力をログ ファイルにリダイレクトしますが、dll 出力を同じログ ファイルにリダイレクトしません。dll には独自のログコアが含まれており、そのメッセージを最初に他のコアにリダイレクトする必要があると思います。私は問題をグーグルで検索しましたが、簡単な解決策を見つけることができませんでしたが、これはセットアップ中にメインで1行の呼び出しである必要があるように感じます. そして、dll インターフェイスのブースト ログコア シングルトンへのゲッター。

私が見逃している標準的な方法はありますか?そのログをここにリダイレクトするにはどうすればよいですか?

編集 #1: - 私のシステムでの出力と、私がやりたいことのフィクション。 ここに画像の説明を入力

編集#2:-ここで可能な解決策を見つけました。- そのヒントで問題が解決する場合は、クローンであるため、この質問を削除します。

編集 #3: 編集 #2 から提案されたソリューションを実装しました。それは機能しますが、私が望むものではありません。

基本的に、あなたはするはず#define BOOST_LOG_DYN_LINKです。残念ながら、ログは再帰的に追加する必要がある他のライブラリを使用しているため、これは機能しません。私はで終わった#define BOOST_ALL_DYN_LINK。すべてのブーストが動的になり、V1.59 では 30 個の dll になる可能性があります。私の最小限の例では、chrono、date_time、filesystem、log_setup、log、regex、system、および thread (.count = 8) の dll を提供する必要がありました。

したがって、結果がまさに私が望んでいたものであるにもかかわらず、それに到達する方法が異なりますが、これはこの質問を他の質問と区別します. DLL アプローチにより、コアの dll シングルトンが 1 つだけになることが保証されます。私は、dll を提供するよりも 2 つのコアを使用することを好みます。

静的にリンクしている間に同じ結果を得る方法はありますか?

4

2 に答える 2

1

複数のモジュールから使用する場合は、Boost.Logを共有ライブラリとしてビルドする必要があります。ライブラリの設計はその要件に依存しており、ロギング コアはライブラリ内の唯一のシングルトンではありません。使用するライブラリ機能によっては、この前提条件に違反すると、デバッグが困難な問題が発生する可能性が高くなります。また、現在使用しているバージョンの Boost.Log で動作するコードが、別のバージョンでは機能しなくなる可能性もあります。

于 2015-11-03T07:16:34.600 に答える