私はこれをやろうとしました: Boost::Log を使用する Windows (*.dll) で 1 つの共有ライブラリを作成します ( Boost::Log をこのライブラリに静的にリンクしたいのは、すべてを 1 つの DLL ファイルだけにパッケージ化したいからです)。うまくいきませんでした。
私のプロジェクトには、次の 4 つのファイルがあります。
私のCMakeLists.txt:(Boostライブラリを見つける別のCMakeLists.txtがありますfind_package(Boost 1.54.0 REQUIRED thread log log_setup filesystem date_time system)
)
cmake_minimum_required(VERSION 2.6)
add_library(mylog SHARED
mylog.cpp
)
target_link_libraries(mylog ${Boost_LIBRARIES})
if(UNIX)
target_link_libraries(mylog rt)
endif(UNIX)
add_executable(testlog
main.cpp
)
target_link_libraries(testlog mylog)
私のmylog.cpp :
#include "mylog.h"
namespace logging = boost::log;
namespace expr = boost::log::expressions;
namespace keywords = boost::log::keywords;
__declspec( dllexport ) void initLog()
{
logging::add_file_log(
keywords::file_name = "testlog.log",
keywords::format = expr::format("%1% [%2%] %3% ")
% expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d, %H:%M:%S.%f")
% expr::attr< logging::trivial::severity_level >("Severity")
% expr::smessage
);
logging::add_common_attributes();
}
そしてmylog.h :
#ifndef _MYLOG_H
#define _MYLOG_H
#include <boost/log/common.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/sinks.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/date_time/local_time/local_time.hpp>
#include <boost/log/utility/empty_deleter.hpp>
__declspec( dllexport ) void initLog();
#endif //_MYLOG_H
私のmain.cpp :
#include "mylog.h"
int main(int, char*[])
{
using namespace boost::log::trivial;
initLog();
BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
BOOST_LOG_TRIVIAL(info) << "An informational severity message";
BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
BOOST_LOG_TRIVIAL(error) << "An error severity message";
BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
return 0;
}
ライブラリmylogを静的なもの (SHARED キーワードなし) としてコンパイルし、プログラムtestlogを実行すると、ログ メッセージがファイルtestlog.logに保存され、コードが示すように画面に何も出力されません。
2013-12-20, 15:05:36.741156 [trace] A trace severity message
2013-12-20, 15:05:36.742156 [debug] A debug severity message
2013-12-20, 15:05:36.743156 [info] An informational severity message
2013-12-20, 15:05:36.743156 [warning] A warning severity message
2013-12-20, 15:05:36.743156 [error] An error severity message
2013-12-20, 15:05:36.743156 [fatal] A fatal severity message
しかし、 (SHARED キーワードを使用して) DLL共有ライブラリにコンパイルすると、コンパイルは成功しましたが、結果は期待どおりではありませんでした。ログ ファイルは作成されず、メッセージは異なる形式で画面に表示されました。関数initLogが実行されていないようです:
[2013-12-20 15:06:17.195469] [0x00000e6c] [trace] A trace severity message
[2013-12-20 15:06:17.198470] [0x00000e6c] [debug] A debug severity message
[2013-12-20 15:06:17.198470] [0x00000e6c] [info] An informational severity message
[2013-12-20 15:06:17.199470] [0x00000e6c] [warning] A warning severity message
[2013-12-20 15:06:17.199470] [0x00000e6c] [error] An error severity message
[2013-12-20 15:06:17.200470] [0x00000e6c] [fatal] A fatal severity message
これについて私を助けてください。ありがとう。
P/S: Boost::Log::Trivial を使用せずに、ロギング用のカスタム シンクを作成しようとしましたが、結果は同じです。Boost 1.54.0 と 1.55.0 の両方がテストされています。