Ich versuche, spdlog in einem Projekt zu verwenden, das eine Bibliothek unter Windows einbezieht. Ich erstelle zwei Logger. Eine für die App, die die Bibliothek verwendet, eine für die Bibliothek selbst. Der Logger der Bibliothek wird aus der App erstellt, aber wenn die Bibliothek eine Nachricht hinzufügen möchte, stürzt sie ab.Loggen von Bibliothek mit spdlog
Folgendes ist ein vereinfachtes Beispiel.
Die Bibliothek
libclass.h
#ifndef LIBCLASS_H
#define LIBCLASS_H
#include <spdlog/spdlog.h>
#ifdef WIN32
# ifdef BUILD_APPLIB_SHARED
# define APPLIB_EXPORT __declspec(dllexport)
# else
# define APPLIB_EXPORT
# endif //BUILD_APPLIB_SHARED
#else
# define APPLIB_EXPORT
#endif // WIN32
class APPLIB_EXPORT LibClass
{
public:
LibClass();
~LibClass();
static std::string loggerName();
void testLog();
private:
std::shared_ptr<spdlog::logger> m_logger;
};
#endif //LIBCLASS_H
libclass.cpp
#include "libclass.h"
const std::string myLoggerName = "lib_logger";
LibClass::LibClass()
{
m_logger = spdlog::get(myLoggerName);
}
LibClass::~LibClass()
{ }
std::string LibClass::loggerName()
{
return myLoggerName;
}
void LibClass::testLog()
{
m_logger->info("Log from library");
}
Die Anwendung
main.cpp
#include <spdlog/spdlog.h>
#include <applib/libclass.h>
void logtest()
{
auto logger = spdlog::get("app_logger");
logger->info("Log from application");
}
int main(int argc, char *argv[])
{
// create loggers
auto appLogger = spdlog::stdout_logger_mt("app_logger");
auto libLogger = spdlog::stdout_logger_mt(LibClass::loggerName());
// log from app
logtest();
// log from lib
LibClass lc;
lc.testLog();
return 0;
}
Ihr Beispiel funktioniert, weil alles unter der gleichen Binärdatei ist. Wenn Sie die libclass in einer gemeinsam genutzten Bibliothek erstellen und die Hauptverknüpfung mit der gemeinsam genutzten Bibliothek durchführen, funktioniert sie nicht. – AlexandreP