2015-05-22 12 views
6

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; 
} 

Antwort

1

Ihr Beispiel arbeitet auf der current version von spdlog fein:

$ g++ -std=c++11 main.cpp libclass.cpp -I . 
$ ./a.out 
[2015-08-24 07:29:04.502] [app_logger] [info] Log from application 
[2015-08-24 07:29:04.502] [lib_logger] [info] Log from library 

Gleiche bei Verwendung einer gemeinsam genutzten Bibliothek:

# CMake config: 
project(TEST) 
include_directories(.) 
add_library(class SHARED libclass.cpp) 
target_compile_options(class PUBLIC -std=c++11) 
add_executable(main main.cpp) 
target_link_libraries(main class) 

Re Ergebnisse:

$ cmake . 
$ make 
$ ldd main 
    ... 
    libclass.so => ... 
$ ./main 
[2015-08-25 08:57:51.864] [app_logger] [info] Log from application 
[2015-08-25 08:57:51.864] [lib_logger] [info] Log from library 

Stellen Sie sicher, dass Sie eine Verknüpfung mit einer DLL-Laufzeit unter Windows herstellen.

+2

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

Verwandte Themen