Я пытаюсь использовать G3Log (версию логатора Google - glog), чтобы выполнить некоторую регистрацию в статической библиотеке. Все работает очень хорошо, пока я не попытаюсь принести эту статическую библиотеку в управляемую оболочку C++/CLI. Когда я делаю это, я получаю страшный вопрос:Скрытие реализации G3Log
error C1189: #error : <mutex> is not supported when compiling with /clr or /clr:pure.
Проблема, в том, что функции обратного вызова для мойки требуется g2 :: LogMessageMover, и сделать это, я должен вернуть в заголовочном файле. Итак, как я могу инкапсулировать заголовок glog.hpp, чтобы не сделать его видимым для приложения C++/CLI?
Вот что я пробовал, но я застрял на обратном вызове для раковины.
class Log {
private:
void *log_;
void *trace_;
void *logworker;
public:
std::string LogPath = "";
std::string LogFile = "Log.txt";
std::string TraceFile = "Trace.txt";
Log();
void Initialize(std::string log_path, std::string log_file, std::string trace_file);
// How to define this and hide the implementation??
void LogMessage(g2::LogMessageMover message);
// How to define this and hide the implementation??
void TraceMessage(g2::LogMessageMover message);
virtual ~Log();
};
Вот файл CPP:
#include "include/g2logworker.hpp"
#include "include/g2log.hpp"
Log::Log() {
logworker = (void *)(g2::LogWorker::createWithNoSink().get());
};
void Log::Initialize(std::string log_path, std::string log_file, std::string trace_file) {
auto worker = static_cast<g2::LogWorker *>(logworker);
auto loghandle = worker->addSink(std::make_unique<Log>(), &Log::LogMessage);
log_ = (void *) loghandle.get();
auto tracehandle = worker->addSink(std::make_unique<Log>(), &Log::TraceMessage);
trace_ = (void *) tracehandle.get();
g2::initializeLogging(worker);
};
void Log::LogMessage(g2::LogMessageMover message) {
fprintf(stderr, "Got the log message");
};
void Log::TraceMessage(g2::LogMessageMover message) {
fprintf(stderr, "Got the trace message");
};
Чувствительная свободная очередь на верблюжьем замке отлично работает с g3log. Кроме того, вы также получаете значительное увеличение скорости для среднего случая. –